【发布时间】:2017-05-14 03:42:45
【问题描述】:
我刚开始学习 C,我决定在 Euler Problems 上做一些练习。 不工作的程序旨在解决问题 2,它要求计算所有低于 4,000,000 的偶数斐波那契数的总和。
这个程序真正奇怪的是它确实有效,但前提是我在递归期间打印一些东西:每当我尝试在递归函数中注释掉 printf("bazooka"); 行时,我得到的结果似乎完全随机,并且在连续执行同一程序时出现大的正数和大的负数(例如 -882154758 和 770491113)。
另一方面,如果我在递归函数中打印一些东西,无论如何,我都会得到正确的输出。
我发现这种行为非常奇怪和有趣,我真的很想知道发生了什么:真正让我感到困惑的是,即使程序根本没有改变,输出的数字也会发生变化。另外,我不明白为什么在递归期间打印会对正在执行的整数计算产生任何影响。
这是我的主要功能:
int first = 1; int second = 2; int total = 0;
total = Fibo(first,second, total);
printf("\nthis is my result for Euler 2: ");
printf("%d",total);
这是我的递归函数:
int Fibo(int first, int second, int total) {
printf("bazooka");
if (second < 4000000) {
int add;
second = first+second;
first = second-first;
if (first%2 == 0) {
add = first;
}
total = add+Fibo(first,second,total);
}
return total;
}
谁能帮我解决这个问题?非常感谢您的帮助。
【问题讨论】:
-
你需要初始化
int add = 0;。否则,它可以(并且显然确实)采用恰好写入存储在行total = add+Fibo(first,second,total);中的任何值 -
即使有你的
bazooka修复,我也会得到-1900183196。这肯定是错的。 -
一个递归函数完全过度杀戮。把这个技巧留给更难的问题吧。一个简单的循环就可以做到。因为限制是 4000000
int对于 32 位机器来说已经足够了。 -
@andy_programs 正如 Rad Lexus 指出的那样,它并没有真正解决它(至少不是以可靠的方式) - 它可能只是对您调用的特定系统的副作用
printf更改了后来被add占用的内存位置中的值。虽然不能保证这种行为 -
不,不是,它建议您放弃解决方案并重新开始,因为编程是为了找到最简单的解决方案。通过问题的难度来培养你的技能,而不是让它们变得更复杂。
标签: c recursion printf fibonacci