Ваше общее понимание верно. Вам не хватает только подключения последних точек.
Ключевой момент, который нужно запомнить, - когда функция возвращается, она возвращается туда, откуда была вызвана. Рекурсивные функции ничем не отличаются в этом фундаментальном отношении. Рекурсивные вызовы функций работают точно так же.
Это поможет понять, если вы пометите каждый рекурсивный вызов. Давайте назовем начальный вызов рекурсивной функции "A
". Когда рекурсивная функция вызывает себя рекурсивно, вызовите этот вызов рекурсивной функции "B
". Затем он снова звонит, и это "C
". Затем следует «D
» и т. Д.
Ключевым моментом, который необходимо понять, является то, что когда функция возвращается, она возвращается туда, откуда она была вызвана. Таким образом, «D
» возвращается к «C
», что возвращает к «B
», и возвращается к «A
».
Теперь рассмотрим вашу рекурсивную функцию. Когда у стека осталось одно значение, назовем его «D
», он удаляет значение «D
» из стека и выполняет рекурсивный вызов «E
», который обнаруживает, что стек пуст.
Таким образом, он возвращается к «D
», что возвращает значение «D
» обратно в стек, который теперь снова имеет одно значение. Затем он возвращается к «C
», что возвращает значение «C
» обратно в стек, который теперь содержит два исходных, последних значения в стеке, в том же порядке.
Inтаким образом, вызовы функции раскручиваются в обратном порядке по сравнению с их исходной последовательностью вызова, восстанавливая стек точно таким, каким он был изначально.