我是 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/