斐波那契递归函子

时间:2012-10-29 18:45:56

标签: prolog fibonacci

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

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)

1 个答案:

答案 0 :(得分:3)

你的第二个条款fib_tail有两个缺陷:

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

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

我认为你应该在尝试实现双重递归定义之前,并且当它正在工作时优化去除昂贵的调用。