Рекурсия возвращается !
Всем привет !
вот моя первая тема. Думал я разобрался, но сегодня изменил одно значение и у меня такой вопрос: 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,
ты реально так глуп, или ты очень жирный тролль ? 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 |
хМ..для вас все начинающие глупые?
Почему 25 оказался именно в n ? Какой вобще переменной присваиваются значения при повторном вызове функции?где хранится тот же 125 ведь я не писал так: x *= pow1(x, n-1) |
Как я понял всё хранится в так называемом стеке памяти и результат это не значение n или x это значение стека в который при каждом вызове закидывались значения, так?
|
Цитата:
Только те, кто материал объемом в две пары(лекция и практика) не могут усвоить за три дня, и при этом задают такие вопросы, как задаете вы Цитата:
значениями n в ваших примерах были только 1,2,3 Цитата:
Они вычислялись(начиная с самой внутренней функции), и передавались через оператор return наверх, где использовались в дальнейших вычислениях. Цитата:
У вас вообще какая-то странная логика Цитата:
каждый шаг вычисления 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 |
Цитата:
Но я на самом деле уже во всём разобрался немного пошарив в инете, да и ваш ответ был мне подсказкой, хоть вы меня и не поняли, но видно я не совсем правильно вопрос задал. Спасибо! |
Часовой пояс GMT +3, время: 07:55. |