Рекурсия. Почему не прерывается функция оператором 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. Как это вообще понять? |
return отрабатывает, и прекращает выполнение текущей функции, но до того как он это сделает, запускает pow(x, n - 1) и результат ее выполнения умножает на x и только потом возвращает результат и прекращает выполнение. тоесть сначала выполняется самая глубокая, потом уровнем выше итд.
|
Дочитав до конца, в принципе, я начал понимать как всё это работает. Надо же было кому-то такое придумать.. :(
|
Часовой пояс GMT +3, время: 21:52. |