Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Рекурсия возвращается ! (https://javascript.ru/forum/misc/28139-rekursiya-vozvrashhaetsya.html)

S.D.Maquis 09.05.2012 04:38

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

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 ясно но и тут не доконца!.

Gvozd 09.05.2012 04:56

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

S.D.Maquis 09.05.2012 05:09

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

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

S.D.Maquis 09.05.2012 05:28

Как я понял всё хранится в так называемом стеке памяти и результат это не значение n или x это значение стека в который при каждом вызове закидывались значения, так?

Gvozd 09.05.2012 05:44

Цитата:

Сообщение от 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

S.D.Maquis 09.05.2012 06:04

Цитата:

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

я же не все три для сидел и усваивал :), я читал и другой материал, просто так получилось думал что понял всё но оказалось понял но не доконца.


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

Спасибо!


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