这是来自项目Euler的问题2。我编写了以下看似纯真的代码:

public class FibonacciEven {
    public static void main(String[] stuff) {
        long sum = 0;
        int i = 0;
        while(fib(i) <= 40) {
            boolean even = fib(i) % 2 == 0;
            if(even) {
                sum += fib(i);
            }
            else {
                continue;
            }
            i++;
        }
        System.out.println(sum);
    }
    public static long fib(int n) {
        long prev1 = 0;
        long prev2 = 1;
        for(int i = 0; i < n; i++) {
            long savePrev1 = prev1;
            prev1 = prev2;
            prev2 = savePrev1 + prev2;
        }
        return prev1;
    }
}


我确实读过有关计算斐波那契数的Java方法是如何占用大量内存的,但是,正如您所看到的,我将限制减小到40,但仍然没有达到终点,因此我假设我有语法有些错误。哪些代码使它永远运行?并且,如果所有这些确实是由于该方法需要花费大量时间才能运行的事实,那么有人可以建议一种更好的方法吗?

编辑:好的,现在我的代码如下:

public class FibonacciEven {
    public static void main(String[] stuff) {
        long sum = 0;
        int i = 0;
        while(fib(i) <= 40) {
            boolean even = fib(i) % 2 == 0;
            if(even) {
                sum += fib(i);
            }
            i++;
        }
        System.out.println(sum);
    }
    public static long fib(int n) {
        long prev1 = 0;
        long prev2 = 1;
        for(int i = 0; i < n; i++) {
            long savePrev1 = prev1;
            prev1 = prev2;
            prev2 = savePrev1 + prev2;
        }
        return prev1;
    }
}


这次它忽略了斐波那契数列中的2(索引3)。

最佳答案

如果even为false,则您将在不更新i的情况下得到continuin-因此它将再次循环并再次执行完全相同的工作,因此even将再次为false,依此类推。

我怀疑您只是想取出else块。

09-16 03:14