有些人可能熟悉ProjectEuler;一个网站/社区,其中包含一系列基于逻辑数字的谜题,可以通过使用代码来解决。 他们有一个问题“通过考虑Fibonacci序列中的值不超过四百万的项,找到偶数项的总和” 我生成了以下代码作为解决方案
int firstNumber = 0;
int Total = 0;
for (int fib = 0; fib < 4000000; fib+=firstNumber)
{
firstNumber += fib;
if (fib % 2 == 0)
{
total += fib
}
}
我试过的IDE无法执行此操作。我几乎是全新的编程,我在学校所做的课程直接从面向对象编程开始,所以我没有太多的计算机科学背景继续下去。正如您所看到的,理论上我提供的代码应该将增量更改为前一个值,因此创建斐波纳契序列,并将每个偶数添加到总数中应该为我提供答案,对吧? 从逻辑上讲,这似乎是合适的,但我离软件工程师很远,我真的不知道自己在做什么。 所以,我想我的问题是,我的代码究竟出了什么问题以及你如何处理问题的解决方案? 谢谢,亚当。
答案 0 :(得分:2)
您的解决方案存在两个问题。首先,你在0处开始这两个项,并且将0添加到0只得到0.你应该从1开始。其次,您当前的字词在fib
和firstNumber
之间交替。您需要一个临时值来将两者的总和放入,然后将firstNubmer
设置为fib
,然后将fib
设置为临时值。所以,你真的可以使用while
循环代替。
int firstNumber = 1;
int fib = 1;
int Total = 0;
while(fib < 4000000)
{
if (fib % 2 == 0)
{
total += fib;
}
int temp = firstNumber + fib;
firstNumber = fib;
fib = temp;
}
但这是我如何解决同样的问题。请注意,这为您提供了一种可以重用于其他Euler问题的方法。另请注意,我不是使用临时变量,而是将前一个术语添加到当前值以获取下一个,然后从当前值中减去前一个值将导致在添加前一个值之前的当前值。
public static IEnumerable<long> FibSeries()
{
yield return 1;
long previous = 1;
long current = 1;
while (true)
{
yield return current;
current += previous;
previous = current - previous;
}
}
然后你可以用Linq解决它
long sum = FibSeries().TakeWhile(f => f < 4000000).Where(f => f % 2 == 0).Sum();