Страницы

Поиск по вопросам

воскресенье, 16 февраля 2020 г.

Рекурсия и стек

#javascript #рекурсия #стек


В общем единственная тема, которую я никак не могу понять - это рекурсия. Написал
маленький код, но не понимаю как он работает до конца.

function power (base, exponent){
   if (exponent == 0)
       return 1;
   else
       return base * power(base, exponent -1);
}

console.log(power(2, 3));


Можете ли объяснить по шагам как тут всё устроено? 
    


Ответы

Ответ 1



Вызываем функцию с параметрами (2,3), т.е. функция имеет данный вид: function power (2, 3){ if (3 == 0) return 1; else return 2 * power(2, 3 - 1); } Далее функция(назовем ее внешняя) вызывает сама себя и создает новый уровень вложенности( назовем клон 1 ), (PS внешняя не может завершиться пока не завершатся все внутренние(клоны)) далее клон 1 вызывает сам себя и создает новый уровень вложенности( назовем клон 2 ), далее клон 2 вызывает сам себя и создает новый уровень вложенности( назовем клон 3 ), далее на клоне 3 срабатывает условие if, значит return 1 и клон 3 возвращает единицу клону 2. На клоне 2 срабатывает условие else т.е. 2 * 1( единицу вернул клон 3) , и результат(двойка) возвращается клону 1 На клоне 1 срабатывает условие else т.е. 2 * 2( двойку вернул клон 2 ), и результат(четверку) возвращает внешней функции На внешней функции срабатывает условие else т.е. 2 * 4( четверку вернул клон 1 ), и возвращает результат(восьмерку ) в консоль. Нарисовал схему работы данной функции:

Ответ 2



function power (base, exponent){ //Посчитаем силу базы (хз что это, но надо так надо :) //Если экспонента точно равна нулю, то мы знаем ответ! if (exponent == 0) { return 1; //и он равен нулю } else { //Но если экспонента нулю не равна, то ответ мы не знаем //Попробуем уменьшить экспоненту на 1 и посчитать снова exponent = exponent - 1; //результатом работы функции будет число, умноженное на результат работы ЭТОЙ же функции, но с экспонентой, уменьшенной на 1 return base * power(base, exponent); } //Если придет значение экспоненты меньше нуля, то все, браузеру хана :) }

Комментариев нет:

Отправить комментарий