我想以递归尾部模式计算Prolog中的Fibonacci系列。
fibonacci(0,0).
fibonacci(1,1).
fibonacci(N,Result) :-
fibonacci(N,1,0).
fibonacci(N,Result,Count) :-
Count < N,
!,
Count1 is Count + 1,
Result1 is Result + Count,
fibonacci(N,Result1,Count1).
fibonacci(N,Count,Count).
但结果不正确,有什么问题?
答案 0 :(得分:3)
在行Result1 is Result + Count
中你只添加Count变量Result并添加0,1,2,...但是在fibonacci你需要添加两个前面的例如0,1,(1 + 0 = 1 ),(1 + 1 = 2),....
我建议这样做:
fib(0, 0).
fib(1, 1).
fib(N,Result):-fibonacci(N,0,1,Result).
fibonacci(0,N,_,N).
fibonacci(N, Prev1,Prev2,Result):-
N>0,
New_Prev2 is Prev1+Prev2,
N1 is N-1,
fibonacci(N1,Prev2,New_Prev2,Result).
答案 1 :(得分:2)
这是一个尾递归解决方案。你需要使用累加器。基本上你是在向后计算斐波那契。当你到达1时你停下来。
斐波纳契(0,0)。
fib(1,_,Accum,Accum)。
斐波那契(N,结果): -
N> 0,
FIB(N,0,1,结果)。
fib(N,Val,Accum,Result): -
N1是N-1,
AccumNew是Val + Accum,
fib(N1,Accum,AccumNew,结果)。