Чтобы понять рекурсию, вы должны понимать концепцию стека вызовов. Каждый вызов функции, рекурсивный или нет, помещает новый контекст вызова в стек со своим собственным набором параметров и собственной копией локальных переменных. Когда функция возвращается, контекст извлекается из стека, и вы возвращаете свой «курсор» (на какой строке вы находитесь, состояния переменных и т. Д. c) туда, где он был в предыдущем контексте. Итак, если у вас есть:
function doSomething(n) {
if (n == 1) return;
doSomething(n-1);
console.log("Recursion");
do(n-1);
}
(переименовано, потому что do
- ключевое слово, а print
- не ключевое слово)
... и у вас есть звонок doSomething(3)
, вот что вы увидите шаг за шагом:
> = where we currently are
Call stack Variables
------------------------ ---------
> doSomething n: 3
doSomething n: 3
> doSomething n: 2
doSomething n: 3
doSomething n: 2
> doSomething n: 1
doSomething n: 3
doSomething n: 2
doSomething n: 1
> return
doSomething n: 3
doSomething n: 2
> console.log("Recursion")
doSomething n: 3
doSomething n: 2
> doSomething n: 1
doSomething n: 3
doSomething n: 2
doSomething n: 1
> return
doSomething n: 3
doSomething n: 2
> return
doSomething n: 3
> console.log("Recursion")
. ..et c.