首页 > 解决方案 > 我正在尝试为 fibbonaci 系列编写一个 prolog 程序。这段代码正在无限循环中。有人能告诉你错误是什么吗?

问题描述

fib(0,0).   
fib(1,1).  
fib(A,Result):-    
    fib(A-1,R),  
    fib(A-2,P),  
    Result is R+P.

标签: prologinfinite-loopfibonaccifailure-slice

解决方案


要了解原因,首先要缩小未终止的原因。这是程序中仍然循环的最小部分:

fib(0,0) :-的。
fib(1,1) :-的。
fib(A,结果):-    
    fib(A-1,R), false ,
     fib(A-2,P) ,  
    结果是 R+P

不管参数是什么,这个程序都会循环。因此,您的原始程序也会循环。

要解决此问题,您需要更改可见部分中的某些内容:您需要确保A > 1. 以这种方式,程序现在终止。

此外,正如@andsanmar 正确指出的那样,A-1单独不是一个数字,而只是一个术语-(A,1),因此它永远不会是0nor 1。所以要么写

fib(N,0) :- N =:= 0.
fib(N,1) :- N =:= 1.
...

(is)/2按照@andsanmar 的建议添加。

有关如何缩小未终止原因的更多信息,请参阅


推荐阅读