计算Prolog中的Fibonacci Serie,Tail递归

时间:2016-10-15 14:05:58

标签: prolog fibonacci tail-recursion

我想以递归尾部模式计算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).

但结果不正确,有什么问题?

2 个答案:

答案 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)。
斐波那契(N,结果): -
      N> 0,
      FIB(N,0,1,结果)。

     fib(1,_,Accum,Accum)。
fib(N,Val,Accum,Result): -
      N1是N-1,
      AccumNew是Val + Accum,
      fib(N1,Accum,AccumNew,结果)。