#prolog #fibonacci #tail-recursion
#пролог #фибоначчи #хвостовая рекурсия
Вопрос:
Я хочу вычислить ряд Фибоначчи в Prolog, в режиме рекурсивного хвоста.
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).
но результат неверен, в чем проблема?
Ответ №1:
В строке Result1 is Result Count
вы добавляете только подсчет переменной Result и добавляете 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).
Комментарии:
1. Это хвостовая рекурсия?
2. Отредактировал ответ с помощью хвостовой рекурсивной версии, еще раз спасибо!
3. Потрясающая работа! 🙂
4. Спасибо за ободряющие слова!!
5. какой пример вы пробовали?? Кроме того, каков был ваш результат и желаемый результат??
Ответ №2:
Вот хвостовое рекурсивное решение.Вам нужно использовать накопитель. По сути, вы вычисляете Фибоначчи в обратном направлении. Когда вы дойдете до 1, вы остановитесь.
фибоначчи (0,0).
фибоначчи (N, результат):-
N> 0,
fib(N, 0,1, результат).fib(1,_,Accum, Accum).
fib(N, значение, накопление, результат): —
N1 равно N-1,
накопление нового равно значению накопление,
fib (N1, накопление, накопление нового, результат).