我刚刚经历了斐波纳契系列算法的迭代版本。我发现以下代码
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
答案 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);
}