0

这是来自项目 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)。

4

4 回答 4

5

如果even是假的,你最终会继续而不更新i- 所以它会再次循环并再次做完全相同的工作,所以even会再次是假的,等等......

我怀疑你只是想拿出else块。

于 2012-06-21T19:18:58.387 回答
2

你也每次都重做很多工作。我建议您记住之前计算的值。那和递归是你的朋友。

在此处输入图像描述

我会说这比每次循环都要有效得多。

于 2012-06-21T19:22:45.850 回答
0

您总是可以尝试以更有效的方式计算数字。这是一个很好的描述如何做到这一点:http O(nlogn): //blog.codility.com/2012/03/omicron-2012-codility-programming.html

(此链接中的问题要复杂得多,但计算斐波那契数的方法是相同的)

于 2012-06-21T19:22:20.847 回答
-3

我认为问题最初是针对 i=0 的情况,它布尔返回 false 并且它正在执行
else 部分,尝试在 if 或 else 中增加 i 值。

if(even) {
            sum += fib(i);
i++;
        }
        else {
      continue;
  i++;
      }
于 2012-06-21T19:22:56.723 回答