在效率方面,斐波纳契序列的递归定义存在问题。它的定义如下:
private fib(int n) {
if(n < 2) return n;
else return fib(n - 1) + fib(n-2);
}
假设我们称之为fib(5)。这使得1次调用fib(4),两次调用fib(3),3次调用fib(2),5次调用fib(1)和3次调用fib(0)。
在他的书中
Eric Roberts编写的Java抽象
Roberts提到我们可以通过认识到斐波纳契序列只是additiveSequence(int n, int t0, int t1)
方法的一个特例来解决这个效率问题。基本上,Fibonacci序列只是一个严格以0和1开头的加法序列。有无数个序列与Fibonacci表示的递归关系相匹配。
作者解决了效率问题如下:
private int fib(int n) {
return additiveSequence(n, 0, 1);
}
所以我的问题是,通过使fib序列成为更通用的additiveSequence方法的包装器,我们真的能提高效率吗?如果它确实遵循相同的精确重新关系,那么附加序列的实现在fib的效率方面是否会有相同的“问题”?