0

欧拉计划问题 2。

斐波那契数列中的每个新项都是通过添加前两项来生成的。从 1 和 2 开始,前 10 个术语将是:

1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

通过考虑斐波那契数列中值不超过四百万的项,求偶数项之和。

我的解决方案:

int firstNum = 1;
int secondNum = 2;
int resultNum = firstNum + secondNum;
int sum = 0;

for (int i = 0; i < 4000000; i++)
{
    firstNum = i;
    secondNum = i;

    if(resultNum == firstNum + secondNum)
    {
        sum += resultNum;
        Console.WriteLine(sum);
    }
}

为什么这不正确,你能引导我进入正确的思维方式吗?

4

4 回答 4

1

斐波那契数列定义为

A 0 = 1,A 1 = 1

A n = A n-1 + A n-2

您的目标是生产模式

1 2 3 5 8 13 等

迭代时,您将需要调整类似于滑动窗口的输入,然后检查是否遇到有效插入(即 < 4M 甚至)

int sum = 0;
int max = 4000000;
for( int n = 0; n < max ; n++ )
{
 //only sum the even numbers
 if( second % 2 == 0 ) sum += second; 

 //adjust
 int result = first + second;
 first = second;
 second = result;

 //test for numbers greater than max
 if( result > max ) break;
}

//output
Console.WriteLine(sum); //An for all even An values

看完这个希望你能看到你遇到的一些问题。

您正在将变量设置为迭代器i,它不会产生定义的 A n而是完全不同的东西。

firstNum = i;
secondNum = i;

此外,您只需计算一次结果。这需要在循环中完成。只计算一次基本上会一直使用静态值。

int resultNum = firstNum + secondNum;

条件语句应该测试偶数以正确添加到总和,但此代码只会测试静态值resultNum

if(resultNum == firstNum + secondNum)

此外,需要对总和进行一些检查,以便在超过最大值时突破。4M 迭代将太多。


不过,这里可以进行更多优化。查看 for 循环,很明显,虽然尚未使用,但迭代器可以是一个强大的工具。

原因是斐波那契符合“黄金比例”。

通过简单观察斐波那契数列在 3 次迭代中达到偶数,迭代器可用于跳过该数列。

double p = (1 + Math.Pow(5,.5)) / 2;
for( int n = 3, sum = 0;;n+=3)
{
 double f = ( Math.Pow(p,n) - Math.Pow( 1 - p , n ) ) / Math.Pow(5,.5);
 if( f > 4000000 ){ 
  Console.WriteLine(sum);
  break;
 }
 sum += (int)Math.Round(f);
}
于 2013-10-08T16:38:07.353 回答
1

尝试这个:

    int n1, n2, fib;
        //n1 = 0;
        //n2 = 1;
        n1 = 1;
        n2 = 1;

        fib = n1 + n2;

        while (fib < 4000000)
        {

            n2 = n1;
            n1 = fib;
            fib = n1 + n2;
        }

然后找到偶数 fib 并将其相加

于 2013-10-08T16:43:56.787 回答
1

对于更模块化的方法(与 LINQ 混合):

IEnumerable<Int32> Fibonacci(Int32 limit = 4000000)
{
    for (Int32 previous = 0, current = 1, next = 0; 
        current <= limit; current = next)
    {
        next = previous + current;
        previous = current;
        yield return next;
    }
}

然后:

var allNumbers = Fibonacci(4000000); // 1,2,3,5,8,13,21
var evenNumbers = allNumbers.Where(x => x % 2 == 0); // 2,8,34,144,610,2584
var sum = evenNumbers.Sum(); // 4613732
于 2013-10-08T16:52:15.047 回答
-2

您的代码不会产生斐波那契数列,也不会检查偶数项

试试这个

int firstNum = 1;
int secondNum = 2;

int sum = 0;

while (secondNum <= 4000000)
{
    if (secondNum % 2 == 0)
        sum += secondNum;

    int resultNum = firstNum + secondNum;
    firstNum = secondNum;
    secondNum = resultNum;
}

Console.WriteLine(sum);
于 2013-10-08T16:10:32.493 回答