我在Project Euler中遇到了这个问题.
这是问题的问题:
Fibonacci序列中的每个新术语都是通过添加前两个术语生成的.从1和2开始,前10个项将是:1,2,3,5,8,13,21,34,55,89,......查找序列中所有偶数项的总和不超过四百万.
到目前为止我的代码:编辑新代码仍然无法正常工作.
static void Main(string[] args)
{
int a = 1;
int b = 2;
int Container = 0;
int Sum = 0;
while (b < 4000000)
{
if (a % 2 == 0)
{
Container += a;
}
Sum = a + b;
a = b;
b = Sum;
}
Container += b;
Console.WriteLine(Container.ToString());
Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)
C#中一个有趣的功能是"yield"关键字,这对于这种事情非常有用:
IEnumerable<int> Fibonacci()
{
int n1 = 0;
int n2 = 1;
yield return 1;
while (true)
{
int n = n1 + n2;
n1 = n2;
n2 = n;
yield return n;
}
}
long result=0;
foreach (int i in Fibonacci().TakeWhile(i => i<4000000).Where(i => i % 2 == 0))
{
result+=i;
}
Console.WriteLine(result);
Run Code Online (Sandbox Code Playgroud)
"传统的"递归Fibonacci实现在这里是有问题的,因为它抛弃了在上一个请求的期限内完成的所有工作.你必须在一个循环中反复调用这样的函数,这会复制很多工作,或者你可以从该实现开始并在递归函数中添加一个参数来构建所需的和结果作为最终的斐波纳契项计算.我更喜欢这个,因为它仍然是核心的通用fibonacci序列,而不是你必须重写或专门化的.
另一种方法是在传统实现中使用事件(委托)来在每个术语完成时调用单独的方法,但是因为我仍然更喜欢迭代器方法,所以我将留下委托选项作为读者的练习.
您的问题不是您的代码包含错误; 你的问题是你的代码包含一个bug,你不知道如何找到它.首先解决第二个问题,然后当你遇到错误时你不需要问我们,你可以自己找到它.
学习如何发现错误很难,需要大量的练习.这是我如何处理这个问题.
我首先将问题简化为我自己可以做的事情.而不是"什么是不超过四百万的偶数纤维数的总和?" 我会问"什么是不超过40的偶数纤维数的总和?" 这很容易手工解决 - 2 + 8 + 34 = 44.
现在在调试器中运行程序,逐步执行每一行,并查看出错的地方.你的程序实际上是2,8和34吗?如果是这样,它会得到正确的结果吗?
| 归档时间: |
|
| 查看次数: |
6951 次 |
| 最近记录: |