修正的Fibonacci序列的迭代版本

时间:2012-06-18 21:34:23

标签: java c++ math sequence fibonacci

我刚刚经历了斐波纳契系列算法的迭代版本。我发现以下代码

int Fibonacci(int n)
{
   int f1 = 0;
   int f2 = 1;
   int fn;
   for ( int i = 2; i < n; i++ )
   {
      fn = f1 + f2;
      f1 = f2;
      f2 = fn;
   }
}  

在我的脑海中提出了一个愚蠢的问题。上面的函数添加了两个先前的数字并返回第三个数字,然后为下一次迭代准备好变量。怎么会这样呢。 “返回一些系列,这是前三个数字的总和”我们如何更改上面的代码来找到这样的数字.u

4 个答案:

答案 0 :(得分:6)

作为提示,请注意上述算法通过某些变量“循环”数字来工作。在上面的代码中,您存储的每个点

 F_0    F_1
  a      b

然后你将它们“移动”一圈在循环中:

 F_1    F_2
  a      b

然后在下一个循环迭代中再次“移动”它们:

 F_2    F_3
  a      b

如果要更新算法总和最后三个值,请考虑将它们存储为:

 T_0    T_1    T_2
  a      b      c

然后再次转移它们:

 T_1    T_2    T_3
  a      b      c

然后再次转移它们:

 T_2    T_3    T_4
  a      b      c

将这种直觉转化为代码是一个很好的练习,所以我会把这些细节留给你。

那就是说 - 计算斐波纳契和“Tribonacci”序列的第n项有很多,很多更快的方法。 This article描述了一个非常聪明的技巧,使用矩阵乘法比上面的循环更快地计算项,并且有代码available here来实现这个算法。

希望这有帮助!

答案 1 :(得分:4)

我喜欢递归。叫我虐待狂。

static int rTribonacci (int n, int a, int b, int c) {
    if (n == 0) return a;
    return rTribonacci (n-1, b, c, a + b + c);
}

int Tribonacci (int n) { return rTribonacci(n, 0, 0, 1); }

答案 2 :(得分:3)

我通常不会回答那些像家庭作业一样“闻”的问题,但是因为其他人已经回复了这就是我要做的事情:

int Tribonacci(int n)
{
    int last[3] = { 0, 0, 1 }; // the start of our sequence

    for(int i = 3; i <= n; i++)
        last[i % 3] = last[i % 3] + last[(i + 1) % 3] + last[(i + 2) % 3];

    return last[n % 3];
}

通过将循环改为:

可以改进一点以避免所有丑陋的模运算(我留下来使最后[]数组的循环性质变得清晰)
    for(int i = 3; i <= n; i++)
        last[i % 3] = last[0] + last[1] + last[2];

它可以进行更多优化,坦率地说,有更好的方法来计算这样的序列,如templatetypedef所说。

答案 3 :(得分:0)

如果要使用递归,则不需要任何其他参数:

int FibonacciN(int position)
{   if(position<0) throw new ArgumentException("invalid position");
    if(position==0 || position ==1) return position;
    return FibonacciN(position-1) + FibonacciN(position-2);
}