C#斐波那契数列
C# fibbonacci numbers
有些人可能熟悉 ProjectEuler; website/community 包含一系列基于逻辑数字的谜题,可以通过使用代码来解决。
他们有一个问题阅读 "By considering the terms in the Fibonacci sequence whose values do not exceed four million, find the sum of the even-valued terms"
我生成了以下代码作为解决方案
int firstNumber = 0;
int Total = 0;
for (int fib = 0; fib < 4000000; fib+=firstNumber)
{
firstNumber += fib;
if (fib % 2 == 0)
{
total += fib
}
}
我试过的 IDE 无法执行此操作。我对编程几乎完全陌生,我在学校上的课程直接从面向对象编程开始,所以我没有太多计算机科学背景可以继续学习。如您所见,理论上我提供的代码应该将增量更改为先前的值,从而创建斐波那契数列,并将每个偶数加到总数中应该会为我提供答案,对吧?
从逻辑上讲,这似乎是合适的,但我离软件工程师还很远,我真的不知道自己在做什么。
所以,我想我的问题是,我的代码到底出了什么问题,您将如何解决问题?
谢谢,亚当。
您的解决方案存在两个问题。首先,您将两个项都从 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;
}
但我是这样解决同样问题的。请注意,这为您提供了一种可重复用于其他欧拉问题的方法。另请注意,我没有使用临时变量,而是将前一项添加到当前项以获得下一项,然后从当前项中减去前一项将得到当前值,然后再将前一项添加到它。
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();
有些人可能熟悉 ProjectEuler; website/community 包含一系列基于逻辑数字的谜题,可以通过使用代码来解决。 他们有一个问题阅读 "By considering the terms in the Fibonacci sequence whose values do not exceed four million, find the sum of the even-valued terms" 我生成了以下代码作为解决方案
int firstNumber = 0;
int Total = 0;
for (int fib = 0; fib < 4000000; fib+=firstNumber)
{
firstNumber += fib;
if (fib % 2 == 0)
{
total += fib
}
}
我试过的 IDE 无法执行此操作。我对编程几乎完全陌生,我在学校上的课程直接从面向对象编程开始,所以我没有太多计算机科学背景可以继续学习。如您所见,理论上我提供的代码应该将增量更改为先前的值,从而创建斐波那契数列,并将每个偶数加到总数中应该会为我提供答案,对吧? 从逻辑上讲,这似乎是合适的,但我离软件工程师还很远,我真的不知道自己在做什么。 所以,我想我的问题是,我的代码到底出了什么问题,您将如何解决问题? 谢谢,亚当。
您的解决方案存在两个问题。首先,您将两个项都从 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;
}
但我是这样解决同样问题的。请注意,这为您提供了一种可重复用于其他欧拉问题的方法。另请注意,我没有使用临时变量,而是将前一项添加到当前项以获得下一项,然后从当前项中减去前一项将得到当前值,然后再将前一项添加到它。
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();