Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 26.10.2014, 13:17
Аватар для volts223
Новичок на форуме
Отправить личное сообщение для volts223 Посмотреть профиль Найти все сообщения от volts223
 
Регистрация: 25.09.2014
Сообщений: 4

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

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

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

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

Последний раз редактировалось volts223, 26.10.2014 в 18:20.
Ответить с цитированием
  #2 (permalink)  
Старый 26.10.2014, 13:30
Аватар для viktorina
Профессор
Отправить личное сообщение для viktorina Посмотреть профиль Найти все сообщения от viktorina
 
Регистрация: 04.01.2013
Сообщений: 173

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

Последний раз редактировалось viktorina, 26.10.2014 в 14:01.
Ответить с цитированием
  #3 (permalink)  
Старый 26.10.2014, 18:23
Аватар для volts223
Новичок на форуме
Отправить личное сообщение для volts223 Посмотреть профиль Найти все сообщения от volts223
 
Регистрация: 25.09.2014
Сообщений: 4

спасибо за подробное объяснение
Ответить с цитированием
  #4 (permalink)  
Старый 26.10.2014, 18:43
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

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

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


Сообщение от viktorina
2 в кубе - это 2*(2*2)
2 в четвёртой - это 2*(2*(2*2))
Для чего скобки?
Ответить с цитированием
  #5 (permalink)  
Старый 26.10.2014, 20:48
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Сообщение от 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 в 20:51.
Ответить с цитированием
  #6 (permalink)  
Старый 26.10.2014, 21:04
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

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

Разница есть для нас, поскольку логика в другой функции по тексту/кодам этой же - такая же, что позволяет обрабатывать или строить самоподобные структуры.
Ответить с цитированием
  #7 (permalink)  
Старый 26.10.2014, 21:06
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

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

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

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

Последний раз редактировалось kostyanet, 26.10.2014 в 21:17.
Ответить с цитированием
  #8 (permalink)  
Старый 26.10.2014, 21:53
Аватар для viktorina
Профессор
Отправить личное сообщение для viktorina Посмотреть профиль Найти все сообщения от viktorina
 
Регистрация: 04.01.2013
Сообщений: 173

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

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

Последний раз редактировалось viktorina, 26.10.2014 в 22:17.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача c тегом <g> в svg Kosty@n Элементы интерфейса 2 14.01.2013 19:08
Задача про квадрат и треугольник dawsonsky Javascript под браузер 0 20.09.2012 15:34
Задача в том, чтобы проставить галочки на журналы и газеты, выбрать количество месяце karat2707 Events/DOM/Window 5 18.04.2012 03:22
Интересная задача для javascript bobri4 Общие вопросы Javascript 4 16.07.2011 13:08
задача "Пересечение сторон фигуры линией в одной точке" lh2030 Общие вопросы Javascript 9 11.03.2011 20:03