Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 09.05.2012, 04:38
Новичок на форуме
Отправить личное сообщение для S.D.Maquis Посмотреть профиль Найти все сообщения от S.D.Maquis
 
Регистрация: 23.10.2011
Сообщений: 9

Рекурсия возвращается !
Всем привет !
вот моя первая тема.
Думал я разобрался, но сегодня изменил одно значение и у меня такой вопрос:

function pow1(x, n) {
	  return (n != 1) ? x*pow1(x, n-1) : x; 
	}
	alert( pow1(5, 3) ); // 125
	
	
	function pow2(x, n) {
	  return (n != 1) ? x*pow2(x, n-1) : n
	}
	alert( pow2(5, 3) ); // 25


Как интерпретатор переводит эту строку: x*pow1(x, n-1)
как я понимаю он делает это так:
5*(5, 3-1) и т.д. пока не дойдёт до n==1(то есть я думаю что там стоят скобки, но на самом деле так это?)

Но основываясь на этой логике бред получается какойто. Откуда например в pow2 выдаёт n=25 ?
с pow1 где в результате x = 125 ясно но и тут не доконца!.

Последний раз редактировалось S.D.Maquis, 09.05.2012 в 04:54.
Ответить с цитированием
  #2 (permalink)  
Старый 09.05.2012, 04:56
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

S.D.Maquis,
ты реально так глуп, или ты очень жирный тролль ?

pow1(5,3) = 5*pow1(5,2)
pow1(5,2) = 5*pow1(5,1)
pow1(5,1) = 5// потому что при n=1, берется значение x, т.е 5
pow1(5,3) = 5*pow1(5,2) = 5*5*pow1(5,1) = 5*5*5 = 125

pow2(5,3) = 5*pow2(5,2)
pow2(5,2) = 5*pow2(5,1)
pow2(5,1) = 1 // потому что при n=1, берется значение n, т.е 1
pow2(5,3) = 5*pow2(5,2) = 5*5*pow2(5,1) = 5*5*1 = 25

разница как видишь в конечных значениях, при n=1
Ответить с цитированием
  #3 (permalink)  
Старый 09.05.2012, 05:09
Новичок на форуме
Отправить личное сообщение для S.D.Maquis Посмотреть профиль Найти все сообщения от S.D.Maquis
 
Регистрация: 23.10.2011
Сообщений: 9

хМ..для вас все начинающие глупые?

Почему 25 оказался именно в n ?
Какой вобще переменной присваиваются значения при повторном вызове функции?где хранится тот же 125 ведь я не писал так:
x *= pow1(x, n-1)

Последний раз редактировалось S.D.Maquis, 09.05.2012 в 05:11.
Ответить с цитированием
  #4 (permalink)  
Старый 09.05.2012, 05:28
Новичок на форуме
Отправить личное сообщение для S.D.Maquis Посмотреть профиль Найти все сообщения от S.D.Maquis
 
Регистрация: 23.10.2011
Сообщений: 9

Как я понял всё хранится в так называемом стеке памяти и результат это не значение n или x это значение стека в который при каждом вызове закидывались значения, так?
Ответить с цитированием
  #5 (permalink)  
Старый 09.05.2012, 05:44
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Сообщение от S.D.Maquis
хМ..для вас все начинающие глупые?
нет.
Только те, кто материал объемом в две пары(лекция и практика) не могут усвоить за три дня, и при этом задают такие вопросы, как задаете вы
Сообщение от S.D.Maquis
Почему 25 оказался именно в n ?
он там не оказывался, вы путаете
значениями n в ваших примерах были только 1,2,3
Сообщение от S.D.Maquis
Какой вобще переменной присваиваются значения при повторном вызове функции?
никакой переменной они не присваивались.
Они вычислялись(начиная с самой внутренней функции), и передавались через оператор return наверх, где использовались в дальнейших вычислениях.
Сообщение от S.D.Maquis
где хранится тот же 125 ведь я не писал так:
x *= pow1(x, n-1)
да нигде не хранится
У вас вообще какая-то странная логика


Сообщение от Gvozd
pow1(5,3) = 5*pow1(5,2) = 5*5*pow1(5,1) = 5*5*5 = 125
посмотрите внимательно на этот расписанный мною алгоритм
каждый шаг вычисления pow1(x, n) я привожу либо к x*pow1(x, n-1), либо x, в зависимости от того, выполняется ли условие (n != 1)

То есть pow1(5,3) равно 5*pow1(5,2), потому что (n != 1), и выполняется первая часть тернарного оператора.
Таким же аналогичным способом вычисляется pow1(5,2)/
Спускаемся ниже, и натыкаемся на то что (n != 1) перестало выполнятся.
Почему?
Да потому что аргументы функции pow1() - x и n не зависят от значнений внешних переменных, а зависят от того что вы передали во внутрь
То есть когда вы пишите
pow1(5, 3), то внутри нее х=5 b n=3
но внутри нее вызывается еще раз pow1, но уже с другими значениями - pow1(5,2)
То есть во внешней функции значения x=5 и n=3, потому что именно эти значения передали в нее, а во внетренней x=5 и n=2, потому что именно эти значения передала в нее внешняя функция.
Внешний n и внутренний n не равны, и зависят от передаваемых значений
А вот x - равны, но также зависят от передаваемых значений.
Равны они лишь потому, что при вызове следующей функции вы передали x как первый аргумент не изменив его

Так вот, спуская вниз, и обнаружив что (n != 1) уже не выполняется, мы берем правую часть тернарного оператора.
В нем уже стоит просто число x
То есть pow1(5,1) = 5
тут рекурсия заканчивается, и мы возвращаемся обратно
Мы уже точно знаем, что
pow1(5,1) = 5
И при этом чуточку раннее мы узнали что
pow1(5,2) = 5*pow1(5,1)
Можем заменить pow1(5,1) на его вычисленное значение 5, и получим что
pow1(5,2) = 5*5
возвращаемся обратно, и по аналогии вычисляем pow1(5,3) через pow1(5,2), заменив его значение на 25
Ответить с цитированием
  #6 (permalink)  
Старый 09.05.2012, 06:04
Новичок на форуме
Отправить личное сообщение для S.D.Maquis Посмотреть профиль Найти все сообщения от S.D.Maquis
 
Регистрация: 23.10.2011
Сообщений: 9

Сообщение от Gvozd Посмотреть сообщение
нет.
Только те, кто материал объемом в две пары(лекция и практика) не могут усвоить за три дня, и при этом задают такие вопросы, как задаете вы
я же не все три для сидел и усваивал , я читал и другой материал, просто так получилось думал что понял всё но оказалось понял но не доконца.


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

Спасибо!

Последний раз редактировалось S.D.Maquis, 09.05.2012 в 06:06.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рекурсия без циклов kilogram Серверные языки и технологии 1 21.04.2012 00:15
рекурсия в обратную сторону bugmenot Общие вопросы Javascript 1 29.11.2011 23:45
RegExp очень нужна рекурсия и ссылочность scuter Общие вопросы Javascript 9 18.08.2011 19:27
jQuery, функция animate(), рекурсия xintrea jQuery 12 03.01.2011 12:33
Рекурсия с setTimeout (jQuery) britanik Общие вопросы Javascript 0 24.04.2009 15:36