2014-10-07 3 views
0
int g(int n) { 
     int x = g(n - 1); 
     if (x > 0) { 
      return x + 1; 
     } else { 
      return 1; 
     } 
    } 

Я предполагаю, что это связано с первой строкой функции ... Но я не уверен, почему это так.Зачем нужна эта рекурсивная функция?

+0

Похоже, вы идете в бесконечную рекурсию. Обычно вы проверяете один или несколько базовых случаев, если не так, то вы делаете рекурсивный вызов. – ChiefTwoPencils

+0

g (n) вызывает g (n-1) независимо от значения n и никогда не заканчивается. – lolando

ответ

1

Если вы запустите его через отладчик, такой как gdb, вы должны увидеть, что он никогда не выходит.

Program received signal SIGSEGV, Segmentation fault. 
0x00000000004004de in g (n=-240246) at test.c:10 

test.c:10 в моем случае это ваша int x = g(n - 1); линия, которая просто держит вызывался снова и снова.

1

Поскольку первая строка функции вызывает точно такую ​​же функцию, «возврат» никогда не будет выполнен. Поэтому это бесконечный цикл, пока он не «сработает».

Если бы мы должны были оценить его: g(20): вызовы g(19): вызовы g(18) и так далее.

Рекурсивный вызов часто вызывается в конце функции или, по крайней мере, после оценки, что гарантирует, что рекурсия не бесконечна (например, в вашем примере кода).

+0

Итак, утверждение «если» никогда не будет рассмотрено? Сбой в первой строке? – user3019324

+0

Точно, он никогда не проходит мимо первой линии. Попробуйте запустить отладчик с точкой останова на 'if': это никогда не ударит. Запуск отладчика с точкой останова на вызове 'g (n-1)' будет постоянно ударяться. – DoubleYou

3

Если функция просто сказал, что это:

int g(int n) { 
    return g(n - 1); 
} 

, то вы, очевидно, не ожидал, что это сработает, но вместо того, чтобы держать рекурсии, пока вы бежите из стека и аварийное завершение работы программы. Помещая рекурсию перед условием выхода в вашу функцию, вы в основном делаете именно это.

Вы должны переписать функцию так, чтобы она выполнила тест выхода до, вызвав снова g().

+0

Итак, базовый регистр должен быть определен до рекурсивного вызова? – user3019324

+1

@ user3019324: Как C++ когда-либо достигнет этого в противном случае? – cHao

Смежные вопросы