Показать сообщение отдельно
  #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
Ответить с цитированием