Компилятор G ++ не разрешит рекурсию? - PullRequest
4 голосов
/ 17 марта 2009

Я создал очень простую программу, которая использует рекурсию. Я использую компилятор 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 голосов
/ 17 марта 2009

В вашем рекурсивном вызове вы используете постфикс -- (numTimes--), а не префиксную версию (--numTimes). В результате значение numTimes уменьшается после рекурсивного вызова. Это означает, что Recurse вызывается с 10 бесконечно. Используйте префиксную версию (которая уменьшит ее перед вызовом) или просто передайте numTimes-1 (поскольку значение numTimes изменять не нужно).

Причина, по которой вы сталкиваетесь с segfault, заключается в том, что ваш стек переполняется в защищенную память.

5 голосов
/ 17 марта 2009

Это может быть "numTimes--", который вызывает бесконечную рекурсию. Постфикс - уменьшит значение в методе -, но вернет исходное значение переменной.

Попробуйте изменить его на --numTimes.

3 голосов
/ 17 марта 2009

Во-первых, вы хотите использовать

#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 голосов
/ 17 марта 2009

Вы увеличиваете numTimes после того, как передаете его в Recurse (), поэтому вы загружаете стек, непрерывно возвращаясь к Recurse со значением 10 и никогда не выводя ничего в cout.

...