prolog - 斐波那契递归仿函数

标签 prolog fibonacci

我是 Prolog 的初学者,我需要这方面的帮助 这个仿函数计算一个数字的斐波那契数......第一次它添加 Y = 0 和 Z = 1 然后它用 Y = Z 和 Z = Y + Z 调用自己并且每次它增加计数器 C 的值直到计数器等于X...... 问题是结果总是等于 1,因为即使 X 不等于 M,prolog 也不会执行第二个子句,但我不知道为什么......

X:要计算的斐波那契数列 Y:斐波那契数列的第一个数字 Z : 斐波那契数列中的第二个数字 C :以 0 为初始值的计数器
T:Y + Z

predicates
fib_tail(integer,integer, integer,integer, real)
clauses
fib_tail(X,Y , Z,M, T):- X=M,T = Y + Z,!.
fib_tail(X,Y ,Z, C , T):-
  T = Y + Z,
  NY = Z,
  NZ = Y + Z,
  NC = C + 1,
  fib_tail(X, NY, NZ, NC, NT).

goal
fib_tail(5 ,0 ,1 ,0, T)

最佳答案

你的第二个子句 fib_tail 有 2 个缺陷:

  • X 永远不会递增
  • NT 是单例,因此不会向调用者“传输”任何值。

编辑注释突出显示 X 不需要递增,与正确递增的 C 进行比较。

我认为您应该在尝试实现双重递归定义之前,并在其工作时优化删除昂贵的调用。

关于prolog - 斐波那契递归仿函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13127778/

相关文章:

prolog - Prolog 中打开并查阅的路径

Prolog - 检查流的结尾不起作用

c - 使用函数计算前 20 个斐波那契数及其总和

prolog - swi-prolog 和 yap 的不同结果

parsing - (Prolog) 将 Lisp s-表达式解析为 Prolog 术语

list - 如何根据长度对序言中的不同输出进行排序?

c++ - 改进 C++ 斐波那契数列

python - 用于图像处理和语音识别的 Julia

c++ - 当我们使用斐波那契数列的递归方法调用 fib(6) 时,fib(3) 被调用多少次?

python - 使用贪婪方法实现斐波那契数列?