Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.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++_C - Fatal编程技术网

C++ 递归函数核

C++ 递归函数核,c++,c,C++,C,我试图编译以下程序 void rec(int n) { if(n>0) { rec(n-1) print ("n"); } } 这里的n值是一个很大的数字,比如1000000 o/p为:分段故障(堆芯转储) 谁能解释一下这里到底发生了什么? 谢谢。你漏掉了一个分号,我想你想打印数字n而不是 n乘以字母n。这是你的固定密码 void rec(int n){ if(n>0){ rec(n-1);

我试图编译以下程序

void rec(int n)
{
    if(n>0)
   {
        rec(n-1)
        print ("n");

   }
}
这里的
n
值是一个很大的数字,比如
1000000

o/p为:
分段故障(堆芯转储)

谁能解释一下这里到底发生了什么?
谢谢。

你漏掉了一个分号,我想你想打印数字n而不是 n乘以字母n。这是你的固定密码

void rec(int n){
    if(n>0){
        rec(n-1);
        printf("%d\n",n);
    }
}
回到你的问题上来。递归函数的问题是每次调用都会创建一个新堆栈。你可以想象,随着每次通话,你越走越深,只会在最后爬起来。
堆栈的数量是有限的,因此如果增加递归调用的数量,程序最终将崩溃。

对于使用默认设置的GCC编译的程序,堆栈大小约为2 MB。因此,堆栈大小限制了递归调用,因为每个非尾部递归函数调用都会减少可用堆栈内存。这就是为什么当
n
是一个大数字时,会出现堆栈溢出。

请查看此站点名称的定义……递归调用使用的堆栈比可用的堆栈多。请尝试使用调试器运行它,并循序渐进地执行程序。如果rec中缺少分号(n-1)line.th缺少分号显然是复制错误,否则代码甚至无法编译。每个调用都会创建一个堆栈帧,而不是整个堆栈。@DietmarKühl虽然可能不需要为尾部调用创建新的堆栈帧,但许多实现无论如何都会这样做。这可能取决于编译器选项,如优化设置。“有问题,每次调用都会创建一个新堆栈。”嗯??如果是这样,就不会有问题了。谢谢你提供的信息。。我们可以增加GCC编译器的堆栈大小吗?当然可以。但是您必须使用特殊的编译器选项,例如:
gcc-Wl,--stack,16777216-o file.exe file.c
此选项将当前程序的堆栈大小增加到16 MiB.pthread实用程序(posix)可以在linux上报告和修改堆栈大小。