2016-10-15 3 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, ... но в фибоначчи вам нужно добавить два предыдущих, например, 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). 
+0

Это хвост рекурсивный? – fpg1503

+0

Отредактированный ответ с рекурсивной версией хвоста, еще раз спасибо! – coder

+0

Удивительная работа! :) – fpg1503

2

Вот хвост рекурсивные solution.You нужно использовать аккумулятор. По сути, вы вычисляете фибоначчи назад. Когда вы доберетесь до 1, вы остановитесь.

fibonacci (0,0).
Фибоначчи (N, Результат): -
N> 0,
fib (N, 0,1, Результат).

fib (1, _, Accum, Accum).
FIB (N, Val Accum, Результат): -
N1 является N1,
AccumNew является Вал + Accum,
FIB (N1, Accum, AccumNew, результат).

Смежные вопросы