2013-03-08 70 views
1

我对项目欧拉的第二个问题的最短解决方案感兴趣:甚至Java中的斐波那契数。项目欧拉即使斐波纳契

Fibonacci序列中的每个新项都是通过添加前两项生成的。从1和2开始,前10项将是: 1,2,3,5,8,13,21,34,55,89,... 通过考虑Fibonacci序列中的值,其值不超过四百万,找到偶数项的总数 。

我在看什么:

public class fibonnaci { 
    public static void main(String[] args) { 
    int f=0,t=0,n=0,s=1; 
    for(;n<4000000;n=f+s){ 
     f=s;s=n; 
     if(n%2==0)t+=n; 
    } 
    System.out.println(t); 
    } 
} 

我添加空格以提高可读性。

我该如何缩短(或者正确的情况下)?

+5

*“我怎样才能让这个短” *良好的代码是没有这么多使用内存和CPU周期2)可扩展与其他程序员维护的“短”为1)高效。这可能是一种'计算机语言',但其中的大部分都是为了人类的眼睛。因此,“明白易懂”比“最低字数”要好。 – 2013-03-08 04:26:44

+0

更短:你不需要'&& n GoZoner 2013-03-08 04:28:01

+3

为了扩展Andrew的说法,更多的描述性变量名称肯定会成为优点。 – 2013-03-08 04:30:12

回答

1

对此的最佳解决方案可能是创建一个Fibonnaci数字的数组。用计数器创建一个循环。至少迭代,计算下一个数字并将其推送到数组上。请记住,由于F(n)= F(n-1)+ F(n-2),并且已经有F(n-1),F(n-2)计算并保存,简单的加法。如果此数字超出您的限制,请退出循环。

现在遍历数组添加每个其他数字(这将是偶数)。

这可能是您最有效的使用CPU。

更新:正如C. Lang(间接地)指出的那样,您可以在计算时保持总和以避免在最后遍历列表。

+1

我想他只是想打印它们。为什么要保存那些你不需要的东西?如果需要迭代和打印它不是最好的? – ChiefTwoPencils 2013-03-08 04:42:17

+0

因为通过保存它们,他不需要在找到F(n + 1),F(n + 2)等等时递归地重新计算它们。 - http://en.wikipedia.org/wiki/Dynamic_programming – 2013-03-08 04:45:49

+0

The你的链接中的fib示例正在拉第n个fib。相对于提供的示例,我的观点是,您仍然必须计算数字才能存储它们。毫无疑问,存储数据会产生额外的成本,其中一半不需要,然后再次遍历数组以打印数据。 – ChiefTwoPencils 2013-03-08 05:00:20

0

如果您认为public static void main(String[]a) {System.out.println(4613732);}作弊,那么如何不奇怪奇数值?

public static void main(String[] args) { 
    int f,s,t=s=2,n=8; 
    for(;n<4000000;t+=n,f=s,s=n,n=f+4*s); 
    System.out.println(t); 
}