无法达到斐波那契数列的基本情况
Not able to reach base case in fibonacci sequence
我是 Prolog 的新手,这种思维方式让我有些混乱。我目前正在使用 SWI-Prolog 运行 并调试我的代码。我已经实现了尾递归算法来解决第 N 个斐波那契数。我已尝试逐步调试,但我无法解释为什么我的实现会跳过基本情况。我哪里想错了?
fib(0, A,_, A). %Base case, when we reach N = 0, return.
%Tail recursion. Use N as counter, iterate until base value (N=0) is reached.
fib(N, A, B, F) :-
Nnew is N - 1,
Sum is (A + B),
fib(Nnew, B, Sum, F).
fib(N, F) :-
fib(N, 0, 1, F). %set start values for when fib(N,F). is called
如果我想计算第 n 个 fib 数,我的实现工作得很好(而且很快)。例如,如果我 运行 ?- fib(5,F).
,我得到 F = 5。伟大的。如果我想检查 ?- fib(5,5).
,我会得到 True
,这是正确的。太好了。
但是,如果我输入了错误的语句,例如:?- fib(5,4).
那么程序将永远循环。发生的情况是 N 传递 0,忽略基本情况(?),并继续递减。为什么跳过基本案例?在我眼里,fib(0,A,_,A).
就满足了。我哪里错了?
您应该将条件 N>0
添加到谓词 fib/3
的第二个子句,否则如果基本情况失败,谓词 fib/3
将继续尝试使用负数。看你咨询时的情况 ?- fib(0,1)
:
这种情况会统一第二个子句fib(0,0,1,1)
,其中Nnew
会被实例化为值-1
。从这里开始Nnew
会无限递减,base-case永远不会统一
任何其他 false
情况,如 ?- fib(5,4)
将尝试递减 N
直到基本情况统一,除非经过 5 次迭代,否则不会发生这种情况,总和斐波那契数等于 4。因此,尝试更多尝试是没有意义的。
我是 Prolog 的新手,这种思维方式让我有些混乱。我目前正在使用 SWI-Prolog 运行 并调试我的代码。我已经实现了尾递归算法来解决第 N 个斐波那契数。我已尝试逐步调试,但我无法解释为什么我的实现会跳过基本情况。我哪里想错了?
fib(0, A,_, A). %Base case, when we reach N = 0, return.
%Tail recursion. Use N as counter, iterate until base value (N=0) is reached.
fib(N, A, B, F) :-
Nnew is N - 1,
Sum is (A + B),
fib(Nnew, B, Sum, F).
fib(N, F) :-
fib(N, 0, 1, F). %set start values for when fib(N,F). is called
如果我想计算第 n 个 fib 数,我的实现工作得很好(而且很快)。例如,如果我 运行 ?- fib(5,F).
,我得到 F = 5。伟大的。如果我想检查 ?- fib(5,5).
,我会得到 True
,这是正确的。太好了。
但是,如果我输入了错误的语句,例如:?- fib(5,4).
那么程序将永远循环。发生的情况是 N 传递 0,忽略基本情况(?),并继续递减。为什么跳过基本案例?在我眼里,fib(0,A,_,A).
就满足了。我哪里错了?
您应该将条件 N>0
添加到谓词 fib/3
的第二个子句,否则如果基本情况失败,谓词 fib/3
将继续尝试使用负数。看你咨询时的情况 ?- fib(0,1)
:
这种情况会统一第二个子句fib(0,0,1,1)
,其中Nnew
会被实例化为值-1
。从这里开始Nnew
会无限递减,base-case永远不会统一
任何其他 false
情况,如 ?- fib(5,4)
将尝试递减 N
直到基本情况统一,除非经过 5 次迭代,否则不会发生这种情况,总和斐波那契数等于 4。因此,尝试更多尝试是没有意义的。