Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Рекурсия. Почему не прерывается функция оператором return ? (https://javascript.ru/forum/misc/76145-rekursiya-pochemu-ne-preryvaetsya-funkciya-operatorom-return.html)

hoz 09.12.2018 01:04

Рекурсия. Почему не прерывается функция оператором return ?
 
В учебнике я прочитал про рекурсию. Теоретически всё понятно и логично, но на практике не всё однозначно.
Вот пример из учебника с дополнительным выводом переменный n, который я сам добавил:
function pow(x, n) {
  if (n != 1) { // пока n != 1, сводить вычисление pow(x,n) к pow(x,n-1)
    console.log("n = ", n);
    return x * pow(x, n - 1);
  } else {
    return x;
  }
}

alert( pow(2, 3) ); // 8

На первый взгляд, здесь нет цикла, что бы всё было очевидным, а лишь условие. Я читаю это так:
1. Мы вызвали функцию pow() и передали аргумент 3 на место параметра n.
2. В функции pow() отрабатывает условие:
if (n != 1)

т.к. (3 != 1), и выполняется выражение:
return x * pow(x, n - 1);

По логике, здесь оператор return, который всегда прерывает работу функции. Но на самом деле, всё не так.
В консоли я вижу, что распечаталась переменная n 2 раза. Т.е. условие:
if (n != 1)

отработало не 1 раз. Как так? Почему return не сработал с первого раза?
Я понимаю, если бы выражение было не с if, а while, for т.е. какими-то циклами. Но здесь if.
Как это вообще понять?

j0hnik 09.12.2018 01:13

return отрабатывает, и прекращает выполнение текущей функции, но до того как он это сделает, запускает pow(x, n - 1) и результат ее выполнения умножает на x и только потом возвращает результат и прекращает выполнение. тоесть сначала выполняется самая глубокая, потом уровнем выше итд.

Rise 09.12.2018 01:21

hoz,
Если поставить ; сразу после return, то так и будет как вы рассуждаете.

hoz 09.12.2018 01:32

Дочитав до конца, в принципе, я начал понимать как всё это работает. Надо же было кому-то такое придумать.. :(


Часовой пояс GMT +3, время: 23:35.