use*_*381 4 prolog fibonacci instantiation-error
这是我的代码: -
fib(0,0).
fib(1,1).
fib(F,N) :-
N>1,
N1 is N-1,
N2 is N-2,
F is F1+F2,
fib(F1,N1),
fib(F2,N2),
write(F," ,").
Run Code Online (Sandbox Code Playgroud)
在GNU Prolog的咨询中,我得到:
| ?- consult('C:/GNU-Prolog/bin/fib.pl').
compiling C:/GNU-Prolog/bin/fib.pl for byte code...
C:/GNU-Prolog/bin/fib.pl compiled, 3 lines read - 1253 bytes written, 15 ms
yes
| ?- fib(F,2).
uncaught exception: error(instantiation_error,(is)/2)
Run Code Online (Sandbox Code Playgroud)
实例化错误是由试图计算引起F的值之前F1,并F2已被确定.最简单的解决方案是F is F1+F2在递归调用之后移动,以便您的程序成为
fib(0,0).
fib(1,1).
fib(F,N) :-
N>1,
N1 is N-1,
N2 is N-2,
fib(F1,N1),
fib(F2,N2),
F is F1+F2,
write(F," ,").
Run Code Online (Sandbox Code Playgroud)
(感谢@mbratch的提醒)write只有一个参数,即 write(F," ,").应该是write(F), write(" ,").
但是你应该小心输出.上面的程序会多次打印出相同的值:例如,计算fib(F,3)它将调用fib(F1,2),fib(F2,1)同时fib(F1,2)将调用fib(F11,1)并fib(F12,1)产生以下输出1, 1, 2, 1, 3.这真的是你需要的吗?