2013-04-22 28 views
0

我試圖讓我自己的斐波那契序列實現。這是我的:在序言中的斐波那契實現

fibo2(N, F) :- 
    fibo2(0, 1, 0, N, F). 

fibo2(N-F, F, N-1, N, F). 

fibo2(P, S, C, N, F) :- 
    C < N, 
    T is S, 
    S1 is P + S, 
    C1 is C + 1, 
    fibo2(T, S1, C1, N, F). 

我知道還有其他的實現,但我不知道爲什麼這不工作。當我做了跟蹤與fibo2(3, 2)我覺得這個調用應該拋出真:

fibo2(1, 2, 2, 3, 2) ? creep 

但它返回false ...一些幫助將不勝感激

+0

你應該在代碼中加入簡短的註釋,解釋每個變量應該是什麼,以及每個謂詞的目的是什麼。至少''fibo2(N,F): - %F是第N個斐波納契數,索引基1「'應該在那裏。 – 2013-04-29 15:34:10

回答

1

首先,T is S線無濟於事。當你不需要進行算術運算時,更喜歡使用(=)/2的標準統一。在這裏,您可以直接撥打fibo2(S, S1, C1, N, F)

然後,你的遞歸沒有基本的情況。 fibo2/5的第一個條款在這裏永遠不會成立。

你肯定意味着:

fibo2(P, S, C, N, F) :- 
    P is N - F, 
    S is F, 
    C is N - 1. 

這裏算術將執行(在頭上做統一的時候,不進行運算,處理完全是象徵性的)。

我不確定你的NF代表什麼,所以我不會再評論你的代碼,但是這應該可以解決一些問題。

+0

問候! :)'fibo2(N,F): - fibo2(0,1,0,N,F)。所以'N,F'可以是變數,所以它們必須到'is'的左邊。所以第一個子句的重寫應該是:'fibo2(P,S,C,N,F): - F = S,N是P + F,C是N-1.'' {'P' =「上一個」; 'S'是一個謎, 'C'可能是「count」,而'F' - 'N'第Fibonacci數}是我的猜測。 :) – 2013-04-29 15:38:42