Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中的递归仅在打印不相关的内容时有效_C_Recursion_Printf_Fibonacci - Fatal编程技术网

C中的递归仅在打印不相关的内容时有效

C中的递归仅在打印不相关的内容时有效,c,recursion,printf,fibonacci,C,Recursion,Printf,Fibonacci,我刚刚开始学习C,我决定做一些练习。 这个不起作用的程序是为了解决问题2,它要求计算所有小于4000000的偶数斐波那契数之和 这个程序真正奇怪的是,它实际上可以工作,但前提是我在递归过程中打印一些东西:每当我尝试注释printf(“火箭筒”)行在递归函数中,我得到的结果似乎完全是随机的,并且在连续执行同一个程序时,在大正数和大负数(例如-882154758和77049113)之间变化。 另一方面,如果我在递归函数中打印一些东西,不管是什么,我都会得到正确的输出 我发现这种行为非常奇怪和有趣,我

我刚刚开始学习C,我决定做一些练习。 这个不起作用的程序是为了解决问题2,它要求计算所有小于4000000的偶数斐波那契数之和

这个程序真正奇怪的是,它实际上可以工作,但前提是我在递归过程中打印一些东西:每当我尝试注释
printf(“火箭筒”)行在递归函数中,我得到的结果似乎完全是随机的,并且在连续执行同一个程序时,在大正数和大负数(例如-882154758和77049113)之间变化。
另一方面,如果我在递归函数中打印一些东西,不管是什么,我都会得到正确的输出

我发现这种行为非常奇怪和有趣,我真的很想知道发生了什么:真正让我困惑的是,即使程序根本没有改变,输出的数字也会改变。另外,我不明白为什么递归期间的打印会对正在执行的整数计算产生任何影响

这是我的主要职能:

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 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 Fibo(int first,int second,int total){
printf(“火箭筒”);
如果(秒<4000000){
int-add;
秒=第一+秒;
第一个=第二个第一个;
如果(第一个%2==0){
加=第一;
}
总计=相加+Fibo(第一、第二、总计);
}
返回总数;
}

有人能帮我弄清楚吗?非常感谢您的帮助。

add
未初始化,如果
first
为奇数。确保在这两种情况下都初始化变量,错误就会消失

现在,为了解释观察到的行为:使用未初始化的变量可以显示为随机“值”,或者它可以导致程序以其他随机方式出现故障。(类C语言中的技术术语是。)在您的情况下,该值可能是先前使用用于函数堆栈帧的内存位置或寄存器的先前值时留下的垃圾。调用
printf
似乎可以解决问题,因为它的实现恰好使用并清除了内存的相关部分。不用说,这不是你可以依赖的


请注意,编译器将使用适当的警告设置来诊断此类错误,例如GCC或Clang的
-Wall

好吧,我不能100%地描述这种行为,但可以肯定的是,当您得到负数这样的数字时,是因为您超过了
int
值的最大值:

INT_MIN = -2147483648 
INT_MAX = +2147483647
将此类型更改为
long
,如果得到相同的结果,则将其更改为
long


您可以检查数据类型边界。

您需要初始化
int add=0。否则,它可以(而且显然是这样)接受在存储在
total=add+Fibo(第一、第二、总计)行中的位置写入的任何值
即使使用您的
火箭筒
修复,我也能得到
-1900183196
。这肯定是错误的。递归函数是完全过死的。把这种技巧留到更难的问题上。一个简单的循环就可以了。由于限制为4000000
int
对于32位机器来说已经足够了。@andy_程序正如Rad Lexus指出的那样,它并不能真正解决这个问题(至少不能以可靠的方式解决)-对
printf
的调用更改了后来被
add
占用的内存位置中的值,这可能只是对特定系统的副作用。这种行为是无法保证的,尽管不是,但它建议您放弃您的解决方案并重新开始,因为编程是为了找到最简单的解决方案。根据问题的难度培养你的技能,不要让问题变得比实际更复杂。这是一个合理的猜测,但正如你从另一个答案中看到的,这不是问题的原因。检查这是否是问题的一个好方法是实际打印出中间值;这样做表明它从未达到如此高的水平。事实上,
int
就足够了。忽略我之前的评论,您的链接中显示的值似乎很奇怪,不太具有代表性。我喜欢cpluplus.com的原因之一是,那里的信息通常更准确。(另外
INT_MIN
INT_MAX
实际上不是常量,它们取决于编译器)