问题描述


  通过考虑斐波那契数列中值不超过四百万的项,找到偶值项的总和


程序

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或更多位数。

09-17 17:25