3

我是 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)
4

1 回答 1

2

您的第二个子句 fib_tail 有两个缺陷:

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

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

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

于 2012-10-29T21:57:58.100 回答