2016-10-15 6 views
1

Prologでフィボナッチ系列を再帰テールモードで計算したい。Prolog、Tail RecursiveでFibonacci Serieを計算する

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). 

しかし、結果は正しくありません。問題は何ですか?

答えて

3

Result1 is Result + Count行には、変数Resultを追加して0,1,2、...を追加するだけですが、フィボナッチでは前の2つ、たとえば0,1、(1 + 0 = 1)、(ここで

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). 
+0

尾部は再帰的ですか? – fpg1503

+0

尾の再帰バージョンの回答を編集しました。ありがとうございました! – coder

+0

驚くばかりの仕事! :) – fpg1503

2

再帰solution.Youは、アキュムレータを使用する必要が尾がある:1 + 1 = 2)、.... 私はこの実装を示唆しています。本質的にはフィボナッチを逆方向に計算しています。 1になるとあなたは止まる。

fibonacci(0,0)。
fibonacci(N、Result): -
N> 0、
fib(N、0,1、Result)。

fib(1、_、Accum、Accum)。
fib(N、Val、Accum、Result): -
N1はN-1,
AccumNewはVal + Accum、
fib(N1、Accum、AccumNew、Result)です。

関連する問題