这是我的密码:-
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," ,").在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)发布于 2014-04-01 20:14:01
实例化错误是由于试图在确定F和F2值之前计算F1。最简单的解决方案是在递归调用之后移动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," ,").(感谢@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。这真的是你需要的吗?
发布于 2014-04-01 20:17:09
在实例化了F is F1+F2和F2之后,您可能需要使用F2。下面是您的代码对某些工作内容的精确调整。现在,我确信这正是您想要的(此外,对于N的大值来说,它失败了,在这里大得令人印象深刻)。
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,
format('~w, ',[F]).我使用的是format而不是write,我不确定write/2是否能实现您的期望。
发布于 2017-05-02 12:51:27
fab1(1,1).
fab1(2,1).
fab1(N,T):-
N>2,
N1 is N-1,
N2 is N-2,
fab1(N1,T1),
fab1(N2,T2),
T is (T1+T2),https://stackoverflow.com/questions/22795708
复制相似问题