为什么这些Prolog代码行的fib(2,1)返回false?
fib(1,F) :-
F is 1.
fib(N,F) :-
N > 1,
fib((N-1),F1),
F is F1.
答案 0 :(得分:0)
首先,(N-1)
在1
为N
时传递2
是错误的模式。
你应该做点什么
fib(N,F) :-
N > 1,
NM1 is N-1,
fib(NM1,F).
第二:您的算法应该F
与1
统一N
。 Fibonacci公式确实不同;更像是
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指令即可看到指数执行时间增长...