我可以在此处发布解决方案,但由于这是家庭作业,因此会适得其反。相反,这里有一个线索:
您列出的斐波那契版本的问题是它效率低下。每次调用fibo/2
都会导致另外两次调用,但其中一些调用会计算相同斐波那契数的值。例如,在伪代码中:
(a) fibo(4) -> fibo(3), fibo(2)
(b) fibo(3) -> fibo(2), fibo(1)
(c) fibo(2) -> fibo(1), fibo(0) % called from (a)
(d) fibo(2) -> fibo(1), fibo(0) % called from (b), redundant
为了克服这个缺陷,您被要求重新表述斐波那契,不仅返回最后一个值,还返回最后两个值,以便每次调用fib/3
将只导致一次递归调用(因此以线性时间计算斐波那契数列)。您需要将基本情况更改为:
fib(1,1,0).
fib(2,1,1).
我将把递归案例留给你。
对于不耐烦的
这也是递归的情况:
fib(N, Val, Last) :-
N > 2,
N1 is N - 1,
fib(N1, Last, Last1), % single call with two output arguments,
% instead of two calls with one output argument
Val is Last + Last1.