2016-10-15 7 views
1

프롤로그에서 피보나치 시리즈를 재귀 꼬리 모드로 계산하고 싶습니다.프롤로그에서 피보나치 세리에 계산, 꼬리 재귀

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 줄에 변수 결과 만 추가하고 0,1,2, ...를 추가합니다. 그러나 fibonacci에서 이전에 예를 들어 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), ..., I가 이 구현을 제안한다. 근본적으로 피보나치를 뒤로 계산하고 있습니다. 1에 도착하면 멈 춥니 다.

fibonacci (0,0).
fibonacci (N, Result) : -
N> 0,
fib (N, 0,1, 결과).

fib (1, _, Accum, Accum).
FIB (N, 발, 누산기, 결과) -
N1은
AccumNew가 발 + 누산기,
FIB (N1, 누산기, AccumNew, 결과)이고, N1이다.