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

时间:2009-03-17 00:54:46

标签: c++ recursion

我创建了一个使用递归的非常简单的程序。我正在使用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 个答案:

答案 0 :(得分:33)

在递归调用中,您使用的是后缀--numTimes--),而不是前缀版本(--numTimes)。结果,numTimes的值在递归调用之后递减。这意味着无限地调用Recurse。使用前缀版本(在调用之前将其递减),或者只传递numTimes-1(因为numTimes值不需要修改)。

您看到段错误的原因是您的堆栈溢出到受保护的内存中。

答案 1 :(得分:5)

可能是导致无限递归的“numTimes--”。后缀 - 将减少 - 方法中的值,但将返回变量的原始值。

尝试将其更改为--numTimes。

答案 2 :(得分:3)

在将numTimes传递给Recurse()之后,你正在递增numTimes,所以你通过连续递归Recurse并使用值10并且从不向cout输出任何内容来吹嘘堆栈。

答案 3 :(得分: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。