递归Prolog Fibonacci公式产生错误的结果

时间:2016-09-12 15:31:54

标签: recursion prolog fibonacci

为什么这些Prolog代码行的fib(2,1)返回false?

fib(1,F) :-
    F is 1.
fib(N,F) :-
    N > 1,
    fib((N-1),F1),
    F is F1.

2 个答案:

答案 0 :(得分:0)

首先,(N-1)1N时传递2是错误的模式。 你应该做点什么

fib(N,F) :-
  N > 1,
  NM1 is N-1,
  fib(NM1,F).

第二:您的算法应该F1统一NFibonacci公式确实不同;更像是

fib(0, 0).
fib(1, 1).
fib(N, F) :-
  N > 1,
  NM1 is N-1,
  NM2 is N-2,
  fib(NM1, FM1),
  fib(NM2, FM2),
  F is FM1+FM2.

第三:为了避免递归调用的指数爆炸问题,我建议使用不同的模式来计算Fibonacci

fibH(0, 0, 0).
fibH(1, 1, 0).
fibH(N, F, FM1) :-
  N > 1,
  NM1 is N-1,
  fibH(NM1, FM1, FM2),
  F is FM1+FM2.
fib(N, F) :-
  fibH(N, F, _).

答案 1 :(得分:0)

如果您的Prolog有表格和大整数,

:- table fib/2.

fib(1, 1).
fib(2, 1).
fib(N, F) :-
  N > 2,
  N1 is N-1,  fib(N1, F1),
  N2 is N-2,  fib(N2, F2),
  F is F1+F2.

只需删除table / 1指令即可看到指数执行时间增长...