我正在尝试自己实施斐波纳契序列。这就是我所拥有的:
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
但它返回错误......一些帮助将不胜感激
答案 0 :(得分: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.
这里将执行算术(当在头部进行统一时,不执行算术,操作完全是符号化的。)
我不确定您的N
和F
代表什么,所以我不会进一步评论您的代码,但这应该已经解决了一些问题。