修正的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

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

  F_0 F_1 ab 

然后,您将它们“循环”循环中的一步:

  F_1 F_2 ab 

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

  F_2 F_3 ab 

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

  T_0 T_1 T_2 abc 

然后再转移它们:

  T_1 T_2 T_3 abc 

然后再转移它们:

  T_2 T_3 T_4 abc 

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

也就是说 – 计算Fibonacci和“Tribonacci”序列的第n项有一个更快更快的方法。 本文描述了一个非常聪明的技巧,使用矩阵乘法比上述循环更快地计算项,并且这里有可用于实现此算法的代码。

希望这可以帮助!

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

 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); } 

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

 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所说。

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

 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); }