Как работает рекурсия, если вызвать это дважды? - PullRequest
0 голосов
/ 26 мая 2020

У меня есть функция:

function do(n) {
    if (n == 1) return;
    do(n-1);
    print "Recursion";
    do(n-1);
}

Как работает рекурсия? Будет называться второй do()?

Не могли бы вы объяснить шаг за шагом, потому что я признаюсь, что если я вызываю do(), он переводит курсор в начало функции do(), чтобы вызвать ее снова, тогда, как я думаю, второй do() не вызывается.

1 Ответ

1 голос
/ 26 мая 2020

Чтобы понять рекурсию, вы должны понимать концепцию стека вызовов. Каждый вызов функции, рекурсивный или нет, помещает новый контекст вызова в стек со своим собственным набором параметров и собственной копией локальных переменных. Когда функция возвращается, контекст извлекается из стека, и вы возвращаете свой «курсор» (на какой строке вы находитесь, состояния переменных и т. Д. 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...