G++编译器不允许递归?

4

我创建了一个非常简单的递归程序,使用的是g++编译器。我可以编译它,但当我尝试运行它时,会收到一个错误消息,内容为SEGMENTATION FAULT。下面是我的代码:

#include <iostream.h>
using namespace std;

int Recurse(int);

int main(int argc, char *argv[])
{
        Recurse(10);
        cout << endl;
}

int Recurse(int numTimes)
{
    if (numTimes == 0)
        return 0;
    else
        {
                cout << numTimes << " ";
        Recurse(numTimes--);
        }
}
4个回答

33

在你的递归调用中,你使用了后缀 --numTimes--),而不是前缀版本(--numTimes)。因此,numTimes 的值是在递归调用之后递减的。这意味着Recurse被无限调用,并始终将10作为参数传入。使用前缀版本(将在调用之前递减)或者直接传递 numTimes-1(因为不需要修改 numTimes 的值)。

你看到段错误的原因是堆栈溢出,它覆盖了保护内存。


+1 表示注意堆栈溢出,并建议使用 x-1 而不是 x--。 - strager

5
可能是 "numTimes--" 导致了无限递归。后置 -- 会在 -- 方法内减少变量值,但会返回变量的原始值。
尝试将其更改为--numTimes。

3
首先,您想使用
#include <iostream>

没有.h文件

现在讲程序:

#include <iostream>
using namespace std;

int Recurse(int);

int main(int argc, char *argv[]) {
        Recurse(10);
        cout << endl;
}

int Recurse(int numTimes) {
    if (numTimes == 0)
        return 0;
    else {
        cout << numTimes << " ";
        return Recurse(--numTimes);
    }
}

您需要在评估之前应用-1。

3
你在将numTimes传递给Recurse()后对其进行了递增,因此你不断地以值10递归进入Recurse,从而导致栈溢出,并且没有向cout输出任何内容。

嘿,一个 Stack Overflow 在 StackOverflow 上 :) - Arnold Spence

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接