Есть небольшая поговорка:
Чтобы понять рекурсию, нужно понимать рекурсию.
Я бы также добавил, что для понимания рекурсии вам необходимо чтобы начать видеть рекурсивные вызовы функций как вызов функции, а не как черный ящик небытия.
Каждая хорошая рекурсивная функция имеет базовый случай (не путать с параметром base
в вашей функции), и этот базовый случай - это рекурсия, которую вы должны понять, т.е. понять, как прийти к базовому случаю.
if (exponent === 0) {
return 1;
}
Вышеупомянутое составляет основу способности функции вычислять мощность.
Процесс оценки
- Чтобы перейти к базовому случаю, каждый раз, когда среда выполнения JavaScript встречает вызов функции, она временно помещает все свои действия в стек - как структура данных, и начинает оценку функции / выражения, т.е. вызывает функцию.
См. В чем разница между выражением и оператором в Python?
Он будет повторять этот процесс до тех пор, пока не встретит вызов функции, который оценивается как значение, и в этом случае он начнет отменять процесс.
Он запускается последним, что он поместил в стек, и замените вызов функции в этом объекте значением, полученным в результате вызова функции, затем снова оценивает это выражение до значения, используя процесс, который я перечислил выше.
Обратите внимание, как этот процесс рекурсивен? Надеюсь, теперь вы начинаете понимать
Причина, по которой ваша рекурсивная функция работает, заключается в том, что каждый раз, когда ваша среда выполнения встречает рекурсивный вызов функции, она рекурсивно оценивает функцию до тех пор, пока не достигнет базового случая, и, надеюсь, базовый случай хорош и больше не рекурсивен, поэтому позволяет функция для возврата к вызывающему.