Top.Mail.Ru
Ответы

Пожалуйста, уделите немного внимания моему вопросу на тему рекурсии. Заранее всем спасибо.

Как я понял рекурсия это функция которая вызывает саму себя каждый раз упрощая исходную большую задачу на более меньшую. Каждый вызов функции и её данные хранятся в stack'е и как только функция доходит до основного случая, происходит обратный вызов из этого stack'a, и при обратном вызове она возвращает данные предыдущей функции, а та другой и так до тех пор пока stack не опустошится. Вроде бы основная теория понятна, но есть некоторые моменты которые я никак не могу понять, с итерацией там всё понятно, там хотя бы понятно какие операция и действия выполняются на каждом шаге итерации, а вот с рекурсией очень сложно понять. Есть рекурсивная функция factorial где n-ое число умножается на предыдущее число и так до одного, например return n * factorial(n - 1) пускай n будет 3 допустим я её где то вызвал, например в функции main, и вот дошло до того момента когда компилятор или интерпретатор встречает вызов функции, она передаёт управление из функции main в функцию factorial а функция main перестает работать и ожидает результат от вызванной функции, функция factorial вызывается с начальным параметром 3 и сразу проверяет не равен ли n одному, если это не так выполняет рекурсивный вызов где return n * factorial(n-1) и вот тут не понятно происходит ли в этот момент умножение n на factorial(n-1) или же происходит рекурсивный вызов и сами функции и данные которые они возвращают сначала накапливаются в stack'e и уже при обратном пути начинают умножаться, тип последняя функции которая вызвалась в последний раз возвращает результат предыдущей функции затем они умножаются и т. д. пока весь stack не будет освобожден? В основном я понял только так, если ошибаюсь то поправьте меня. Ещё другая функция fibonacci в ней уже не одна функция вызывается, а два, return fibonacci(n-1) + fibonacci(n-2) возможно написал неправильно, но не суть, и вот тут тоже не понятно ведь когда управление доходит до вызова функции, а вот именно до fibonacci(n-1) тут же происходит ведь вызов, и пока этот вызов не закончится вряд ли оно дойдёт до fibonacci(n-2) и непонятно когда доходит управление до этой точки. Обязательно ли сильно нужно углубляться в тему рекурсии? Поверхностно я её понял и для чего она может пригодится, иногда циклы могут не помочь решить задачу, и тут рекурсия становится лучшим решением и при этом приходится жертвовать производительностью и памятью. Рекурсия для меня загадочная тема можно ли двигаться дальше, не особо заморачиваясь с этой темой?

По дате
По рейтингу
Аватар пользователя
Искусственный Интеллект
5лет

Рекурсия в данном случае вообще ни при чем. Вычисление любого выражения происходит после того, как получены все необходимые для его вычисления скаляры. Т. е. ВСЕГДА сначала произойдет вызов всех функций, потом будут произведены какие-то вычисления.
Исключение - булевские выражения. Если включена оптимизация, вызов функции не будет произведен. Например, в выражении:

bool boo = false && foo();

функция foo вызвана не будет, поскольку оптимизатор догадается, что итог все равно будет false.

Аватар пользователя
Искусственный Интеллект
5лет

"...и вот тут не понятно происходит ли в этот момент умножение n на factorial(n-1) или же происходит рекурсивный вызов и сами функции и данные которые они возвращают сначала накапливаются в stack'e и уже при обратном пути начинают умножаться..."

Как же произойдёт умножение, если операнды ещё не определены?! Только при "обратном пути"!