Задача на рекурсию
function pow(x, n) { return (n != 1) ? x*pow(x, n-1) : x; // 2*pow(2, 2) } alert( pow(2, 3) ); // 8 Объясните пожалуйста как оно высчитывает число 8 в строке 3 ? |
функция вызывает себя же.
матрёшка. pow(x, n) - вызываем pow(x, n-1) - вызываем pow(x, n-2) - вызываем и так пока n не не достигнет 1. Вы вызвали функцию. Эта функция в свою очередь вызывает себя же, но степень уже на 1 меньше, и так далее. Функция вызывается в функции, которая вызывается в функции. Ещё раз. 2 в кубе - это 2*(2*2) 2 в четвёртой - это 2*(2*(2*2)) function pow(x, n) { return x нужно перемножить n раз } Вот как отработает функция. pow(2, 5) = 2 * (pow(2, 4)) = 2 * (2 * pow(2, 3)) = 2 * (2 * (2 * pow(2, 2))) = 2 * (2 * (2 * (2 * pow(2, 1)))) можно это делать в цикле function pow(x, n) { var result = 1; for (var i = n; i >= 1; i--) { result *= x; } return result } |
спасибо за подробное объяснение:)
|
Вообще не ясен замысел ф-ции, ведь есть уже всё.
alert(Math.pow(2, 3)); Цитата:
|
Цитата:
Функция вызывает _другую_ функцию по тому же самому имени. var rec_func = function(res) { if(++res>3) return res; else return rec_func(res); }; var d = rec_func(1); d; /* 4 */ Произошло вот что Код:
rec_func // взяли текст, положили в память, начали выполнять Никто там сам себя не вызывает. Идет тупое размножение с нуля. То есть с исходного текста применительно к интерпретатору и с исходных данных в компиляторе. |
Ну то есть для калькулятора нет никакой разницы в вызове другой функции из этой, и в вызове другой функции по тексту/кодам этой же.
Разница есть для нас, поскольку логика в другой функции по тексту/кодам этой же - такая же, что позволяет обрабатывать или строить самоподобные структуры. |
https://ru.wikipedia.org/wiki/%D0%A1...B1%D0%B8%D0%B5
Цитата:
[address] [address] [address] [address] [address] [address] [address] [address] [address] ... |
Цитата:
Скобками я попытался показать очерёдность выполнения:), они там для наглядности. |
Часовой пояс GMT +3, время: 07:43. |