Algorithm 用包装器优化斐波那契序列递归函数

Algorithm 用包装器优化斐波那契序列递归函数,algorithm,recursion,fibonacci,Algorithm,Recursion,Fibonacci,当谈到效率时,斐波那契序列的递归定义存在一个问题。其定义如下: private fib(int n) { if(n < 2) return n; else return fib(n - 1) + fib(n-2); } private int fib(int n) { return additiveSequence(n, 0, 1); } 所以我的问题是,通过使fib序列成为更一般的加法序列方法的包装器,我们真的提高了效率吗?在效率方面,加法序列的实现难道不会和

当谈到效率时,斐波那契序列的递归定义存在一个问题。其定义如下:

private fib(int n) {
    if(n < 2) return n;
    else return fib(n - 1) + fib(n-2);
}
private int fib(int n) {
    return additiveSequence(n, 0, 1);
}

所以我的问题是,通过使fib序列成为更一般的加法序列方法的包装器,我们真的提高了效率吗?在效率方面,加法序列的实现难道不会和fib有同样的“问题”,因为它遵循同样的精确循环关系吗?

这里是加法序列计算的一个示例实现,其中ti=ti-1+ti-2:

此方法返回序列中的第n个值。通过一些例子,你应该能够说服自己每个ti只计算一次。将其与您天真地实现的fib方法进行比较,您就会明白为什么这种方法要快得多


斐波那契级数就是这种加法序列,起始条件为t0=0,t1=1。它没有什么特别的地方,除了一个明显的编码方式很差的事实。作者的观点大概是,实现在处理时间上产生了巨大的差异。但是,它似乎没有得到清楚的解释。

您还没有定义如何实现
additiveSequence
。如果没有有效地实现,您将有效率问题。@Salvadodali作者没有提供实现。作者假设您已经有一个名为
additiveSequence
的方法,并且您正在使用该方法作为
fib
方法的返回语句。这就是为什么我如此困惑的原因。那么这本书很可能不是写得不好,就是你没有仔细阅读
additiveSequence
不是一个众所周知的方法,所以我不希望人们知道它。算法的复杂性,甚至它的有效性都取决于这种方法。@SalvadorDali“你需要的关键洞察是,任何加法序列中的第n项都只是加法序列中的(n-1)个项,再往前走一步。”这是给出的唯一解释,对我来说,即使这是密码这可能不是你的观点,但是有一个关于斐波那契数列的O(1)公式:在最近的一次工作会议上,我试着用M+函数和+,=(也就是说,除了1,1之外,没有人工输入的数字)在计算器上计算斐波那契数列
int additiveSequence(int n, int t0, int t1) {
  if(n==0) return t0;
  if(n==1) return t1;
  return additiveSequence(n-1, t1, t0+t1);
}