首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在GNU Prolog中生成fibonacci级数的程序给出了一个实例化错误

在GNU Prolog中生成fibonacci级数的程序给出了一个实例化错误
EN

Stack Overflow用户
提问于 2014-04-01 19:58:36
回答 4查看 32K关注 0票数 5

这是我的密码:-

代码语言:javascript
复制
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的咨询中,我得到:

代码语言:javascript
复制
| ?- 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)
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-04-01 20:14:01

实例化错误是由于试图在确定FF2值之前计算F1。最简单的解决方案是在递归调用之后移动F is F1+F2,从而使程序成为

代码语言:javascript
复制
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。这真的是你需要的吗?

票数 8
EN

Stack Overflow用户

发布于 2014-04-01 20:17:09

在实例化了F is F1+F2F2之后,您可能需要使用F2。下面是您的代码对某些工作内容的精确调整。现在,我确信这正是您想要的(此外,对于N的大值来说,它失败了,在这里大得令人印象深刻)。

代码语言:javascript
复制
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是否能实现您的期望。

票数 2
EN

Stack Overflow用户

发布于 2017-05-02 12:51:27

代码语言:javascript
复制
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),
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22795708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档