Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Задача на рекурсию (https://javascript.ru/forum/misc/51146-zadacha-na-rekursiyu.html)

volts223 26.10.2014 13:17

Задача на рекурсию
 
function pow(x, n) {

  return (n != 1) ? x*pow(x, n-1) : x; // 2*pow(2, 2)
}

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

Объясните пожалуйста как оно высчитывает число 8 в строке 3 ?

viktorina 26.10.2014 13:30

функция вызывает себя же.
матрёшка.
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
 }

volts223 26.10.2014 18:23

спасибо за подробное объяснение:)

ruslan_mart 26.10.2014 18:43

Вообще не ясен замысел ф-ции, ведь есть уже всё.

alert(Math.pow(2, 3));


Цитата:

Сообщение от viktorina
2 в кубе - это 2*(2*2)
2 в четвёртой - это 2*(2*(2*2))

Для чего скобки?

kostyanet 26.10.2014 20:48

Цитата:

Сообщение от viktorina
функция вызывает себя же.

Поклеп!

Функция вызывает _другую_ функцию по тому же самому имени.

var rec_func = function(res) {
   if(++res>3)
     return res;
   else
     return rec_func(res);
};
var d = rec_func(1);
d;

/*
4
*/


Произошло вот что
Код:

rec_func // взяли текст, положили в память, начали выполнять
rec_func // взяли тот же текст, положили в другую память...
rec_func // взяли тот же текст, положили в другую память...
rec_func // взяли тот же текст, положили в другую память...

ну и так далее пока стек не кончится или пока не наступит полное удовлетворение всех этих текстов в различых частях извилин браузера.

Никто там сам себя не вызывает. Идет тупое размножение с нуля. То есть с исходного текста применительно к интерпретатору и с исходных данных в компиляторе.

kostyanet 26.10.2014 21:04

Ну то есть для калькулятора нет никакой разницы в вызове другой функции из этой, и в вызове другой функции по тексту/кодам этой же.

Разница есть для нас, поскольку логика в другой функции по тексту/кодам этой же - такая же, что позволяет обрабатывать или строить самоподобные структуры.

kostyanet 26.10.2014 21:06

https://ru.wikipedia.org/wiki/%D0%A1...B1%D0%B8%D0%B5

Цитата:

Сообщение от viktorina
матрёшка.

Матерешку можно построить, а рекурсия не матерешка. Копия функции ничего не знает о других копиях, они не внутри нее, у нее нет внутренностей, они как и любая другая вызванная функция в памяти, а адрес памяти куда надо вернуться когда эта функция - как и любая другая с тем или иным именем - кончится, лежит в стеке. И стек не матерешка, он вот такой

[address]
[address]
[address]
[address]
[address]
[address]
[address]
[address]
[address]
...

viktorina 26.10.2014 21:53

Цитата:

Сообщение от Ruslan_xDD (Сообщение 337683)
Вообще не ясен замысел ф-ции, ведь есть уже всё.
alert(Math.pow(2, 3));

Для чего скобки?

Я так понимаю человек решает домашнее задание с курсов или что-то подобное, но точно новичок. Тема - рекурсия. Пример выбран - возведение в степень.
Скобками я попытался показать очерёдность выполнения:), они там для наглядности.


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