问题描述
通过考虑斐波那契数列中值不超过四百万的项,找到偶值项的总和
程序
using System;
class fibonacci {
// function to return Nth value of fibonacci
public static long fibo_n(long N) {
long fibon=0;
switch (N) {
case 1: fibon=1; break;
case 2: fibon=2; break;
}
while(N>2) {
fibon=fibo_n(N-1)+fibo_n(N-2);
}
return fibon;
}
}
class fibo_tester {
static void Main() {
int N=2;
long sum=0;
while(fibonacci.fibo_n(N) <= 13) {
sum = sum + fibonacci.fibo_n(N);
N=N+3;
}
Console.WriteLine("Sum is {0}: ", sum);
}
}
我将测试的数量从原来的400万减少到13,但是仍然挂起。有人可以请教吗?
编辑2
switch (N) {
case 1: fibon=1; break;
case 2: fibon=2; break;
default: fibon=fibo_n(N-1)+fibo_n(N-2); break;
}
最佳答案
while(N>2) {
fibon=fibo_n(N-1)+fibo_n(N-2);
}
无限循环,N永远不会在循环中更新。您可能需要删除While()子句并将其全部更改为
return fibo_n(N-1)+fibo_n(N-2);
我不确定您对switch语句等所做的事情。但这应该是一个开始。我实际上将其替换为此(如果您想使用该开关):
class fibonacci
{
// function to return Nth value of fibonacci
public static long fibo_n(long N)
{
switch (N)
{
case 0:
return 0;
case 1:
return 1;
default:
return fibo_n(N - 1) + fibo_n(N - 2);
}
}
}
您可能需要考虑将N的每个值的值存储在字典或某种类型的集合中,以便以后查找它们。由于在您的主程序中,您似乎将遍历这些值(可能已经计算出了较大的N)。我不确定主循环中的N + 3是什么,但是您可能会错过那里的东西(递归中对N-1,N-2的错误假设?)
另外,如果求和并依赖于您的平台以及要测试的值的大小(例如,测试第一个X斐波纳契数的和),您可能必须使用
ulong
或查找一些可以处理更大数字的数据类型。如果我没有在系统上将所有内容从长久更改为冗长的内容,那么这些值就会回绕。无论如何,斐波那契数不能为负,所以为什么不使用ulong或uint64或更多位数。