@StepanMogilyov

Почему рекурсия начинает идти в обратную сторону?

У меня проблема в понимании обратного движения рекурсии (то есть почему она начинает идти обратно в плюс после того как входит в условие if (num <= 1)). Я передаю в num аргументом цифру 4, после чего функция вызывает сама себя, выполняя num - 1. А когда num становится 1, то он входит в условие, где есть return.
1) Не понимаю что именно тут выполняет return
2) Не понимаю как и почему рекурсия начинает идти в обратную сторону (в плюс то есть)

function getFactorial(num) {
  console.log(num)
  if (num <= 1) {
    return
  } else {
    getFactorial(num - 1)
    console.log(num)
    return
  }
}
getFactorial(4)

// 4
// 3
// 2
// 1
// 2
// 3
// 4
  • Вопрос задан
  • 277 просмотров
Пригласить эксперта
Ответы на вопрос 2
@kttotto
пофиг на чем писать
1.  function getFactorial(num) {
2.    console.log(num)
3.    if (num <= 1) {
4.      return
5.    } else {
6.      getFactorial(num - 1)
7.      console.log(num)
8.      return
9.    }
10. }
11.
12. getFactorial(4)


Что такое стек знаете? В рекурсии вызовы будут в виде стека, последним пришел - первым вышел.

1. Вызов getFactorial(4), отработает строка 2, покажет '4'
2. На строке 6 вызов getFactorial(3), отработает строка 2, покажет '3'
3. На строке 6 вызов getFactorial(2), отработает строка 2, покажет '2'
4. На строке 6 вызов getFactorial(1), отработает строка 2, покажет '1'
5. Выход из функции getFactorial(1), отработает строка 4
6. Продолжится выполнение функции getFactorial(2), отработает строка 7, покажет '2'
7. Выход из функции getFactorial(2), отработает строка 8
8. Продолжится выполнение функции getFactorial(3), отработает строка 7, покажет '3'
9. Выход из функции getFactorial(3), отработает строка 8
10. Продолжится выполнение функции getFactorial(4), отработает строка 7, покажет '4'
11. Выход из функции getFactorial(4), отработает строка 8
Ответ написан
@justmavi
Software Development Engineer at Softconstruct
Так. В первую очередь, изучайте, что такое стек вызовов (call stack).
Call stack можно рассматривать как коробку книг, куда можно положить сколько угодно книжек, но читать можно книгу, которая лежит поверх всех книг. Как закончим читать, можем достать уже следующую и так до конца. Работает он по принципу LIFO (Last In First Out, последним пришел - первым ушел).
Когда функция вызывается, она создает запись в стеке вызовов, в которой лежат её аргументы и локальные переменные. Эту запись называют stack frame (стековый кадр). Когда функция вызывает другую функцию, в call stack вставляется новый кадр, уже поверх старого. Как только эта функция заканчивает свою работу, запись из стека удаляется и следующая функция продолжает свою работу и в конце её фрейм тоже удаляется.
В общем, эту тему можно очень глубоко изучать в интернете.

У вас функция работает так:
Изначально вы выводите число в консоль, потом рекурсивно вызываете эту функцию в блоке else с аргументом num -1, дальше снова выводите это число в консоль. То есть, вы выводите каждое число по два раза, но поскольку рекурсия забивает call stack, у вас получается такой "странный" вывод. Уберите console.log из else и картинка поменяется.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы