Да, если оптимизатор вашего компилятора не сделает что-то необычное, эта программа будет аварийно завершена из-за переполнения стека.
Причина в том, что функция convert()
рекурсивно вызывается бесконечно много раз.Вы уже знали это, но суть в следующем: каждая рекурсивная запись в convert()
помещает новый кадр в стек.Каждый кадр содержит адрес возврата к предыдущему кадру и локальное значение n
.
. У компиляторов есть оптимизаторы, но для интуитивного понимания того, что эта функция (а) не имеет побочных эффектов, и (b) потребуется необычный оптимизатор.) не возвращает значения.Поэтому маловероятно, что оптимизатор спасет этот код от ненормального завершения.
Я полагаю, что вы правильно ответили на этот вопрос.
Тем временем комментатор напомнил нам об особом случае, tailрекурсии.Если рекурсивный вызов завершил функцию, как, например, return convert(n/2);
, то компилятор мог бы повторно использовать один кадр стека для всех рекурсивных вызовов.Причина: к тому времени, когда происходит рекурсивный вызов, текущий вызов больше не требует его хранения;объект n
может быть безопасно перезаписан новым n
для рекурсивного вызова;необходимо сохранить только обратный адрес исходному абоненту.Если применяется хвостовая рекурсия, стек не будет расти и, следовательно, программа не будет завершена, ни ненормально, ни иначе.Однако рекурсия хвоста здесь не применима.