Форум сайта python.su
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n - 1)
print(factorial(5))
Так выглядит рекурсивная формула нахождения факториала. Хочу сразу оговориться, вопрос возможно специфический и мне самому все понятно, но есть некоторое сомнение. Попробую изложить с чем оно связано.
Процесс происходит так. Инициализируется значение переменной n, далее поскольку она не равна нулю - она как бы проходит через цикл, в ходе исполнения которого появляется новая глобальная переменная, была 5, стала 4, которая тоже проходит всю часть пути до инструкции return n * factorial(n-1), после чего
появляется новая - 3, так происходит ровно до того момента, когда появляется глобальная переменная 1 и она приводит наконец к исполнению def factorial(0) , а после инструкции if n == 0 ей присваивается значение 1; после чего в стеке мы имеем 6 глобальных переменных, последней из них присвоено значение 0, инструкция if n== 0 возвращает тем самым значение для это 6-ой переменной. Оно равно 1. И так вопрос заключается в следующем. После возвращения значения 6-ой переменной, я так понимаю у нас остается 5-ая переменная и ее значение - “1”, которая пройдя по коду до инструкции return n* factorial(n-1) возвращает значение 1, после этого у нас остается 4-ая переменная n=2. Она проходит тот же самый путь, что и ее предшественница и возвращает через инструкцию return n*factorial(n-1) значение и так далее до самой “первой” переменной. Так что собственно не понятно, правильно ли я понимаю, что когда возвращается значение сохраненное в стеке выражением с return, стек как бы обнуляется на одну ячейку и функция имеет теперь дело с переменной созданной ранее?
Дело в том, что начал рассуждать похожим образом и зашел в тупик. После того, как def factorial(0) вернула 1, управление, так сказать перешло к инструкции return n * factorial(n-1), которое и тут(я и ошибся, полагая, что значение было присвоено Новой переменной n, да?) вернуло значение 1, но НЕ присвоило ее переменной n(что как хочется надеяться, и произошло). Как это было раньше. То есть здесь в этом моменте уже нет рекурсии.
Я же мысленно подставил единицу в начальную функцию и повторил процедуру, полагая, что возвращение значения создает как бы новую переменную, которой, учитывая такую логику пришлось бы тоже принять значение “1”.
Правильно ли я понимаю логику исполнения программы? то есть, верно ли сказанное мной до абзаца со словами “дело в том, что…”? Дойдя до определенного момента в рекурсии она перестала исполняться, вместо этого в обратном порядке с помощью инсрукции return n* factorial(n-1) стали возвращаться все значения переменной n, накопившиеся в стеке до тех пор, пока условие не было выполнено.
Огромное спасибо, если вы мне это разъясните. Мне это очень важно. Хочется во всем разобраться. Опыта маловато. Возникают очень глупые ситуации, наверное. Простите, если это глупый вопрос.
Отредактировано svatty (Фев. 15, 2018 23:02:57)
Офлайн
Здесь требуется понимание двух аспектов: стека и области видимости…
Не буду ничего писать, посмотрите ролики, они очень мне помогли)
https://stepik.org/lesson/24459/step/1?unit=6764
https://stepik.org/lesson/24460/step/1?unit=6766
Офлайн
Тут по ссылкам пройдёшь. Там я объяснял пошагово и разные аспекты.
Офлайн