![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
25.01.2012, 22:04
|
![Аватар для function](https://javascript.ru/forum/image.php?u=18072&dateline=1325850136) |
Говнокодер со стажем
|
|
Регистрация: 06.01.2012
Сообщений: 164
|
|
Работа рекурсии
Привет, люди. Читал ваш учебник и наткнулся на рекурсию...
function pow(x, n) {
return (n != 1) ? x*pow(x,n-1) : x;
}
alert( pow(2, 3) );
Представляю её работу в целом, за исключением одного "но". Когда n!=1 становится false, функция перестаёт сравнивать его с x*pow(x,n-1). Почему? Ведь она может вывести false (ну не просчитывает же программа, что нет, не запуская её), и значение будет верно. И ещё 1 вопрос. Когда дело доходит до запуска новой функции, старая останавливается и ждёт результата?
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
25.01.2012, 22:07
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
1. что она перестаёт сравнивать.. и что она может вывести? она только возвращает результат. я вас не понял.
2. да, т.к. js - однопоточный язык.
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
25.01.2012, 22:14
|
![Аватар для function](https://javascript.ru/forum/image.php?u=18072&dateline=1325850136) |
Говнокодер со стажем
|
|
Регистрация: 06.01.2012
Сообщений: 164
|
|
Когда n становится равно 1, значение (n != 1) выдаёт false. Далее идёт сравнение с x*pow(x,n-1). Эта функция не запускается, чтобы вычислить значение, и каким-то чудесным образом это сравнение даёт true...
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
25.01.2012, 22:43
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
Когда n становится равно 1, выражение (n != 1) возвращает false.
Иначе функция запускает саму себя, где n уменьшено на 1.
Она будет запускать саму себя и уменьшать n до тех пор, пока оно (n) не станет равным единице.
легче понять на примере. передадим функции параметры x=2, n=3. должно получиться 8. поехали.
условие можно расписать как :
if( n == 1 ) {
return x;
} else {
return x*pow(x, n-1)
}
при проходе x=2, n=3. следовательно, функция возвратит число x*pow(x, n-1), то есть, X, умноженный на результат, возвращённый pow(x,n-1). (что бы умножить X на результат pow, её сначало надо выполнить.) - после того, как функция вызывает саму себя (в ней : x=2,n=2), она опять попадает в то же условие, возвращая x*pow(x,n-1). До того, как это возвратить, ей надо опять вычислить результат работы функции pow(x,n-1) (самой себя, т.е).
- после того, как функция вызывает саму себя в третий раз (нумерую с единицы), то x=2,n=1. В развилке n уже равно единице, так что она возвратит x (двойку).
- после того, как она возвратила двойку, начинается обратный ход. во второй функции pow(x,n-1) (там, в ней : x=2,n=2) заменяется на результат прохода третьей функции (в которой x=2,n=1). так что вторая функция возвращает x*x. т.к. это операция, в результате возвращается не x*x, а 4. ( не нужное предложение
)
- после того, как второй вызов (в ней x=2,n=2) возвращает результат (четвёрка), в её выражении x*pow(x,n-1) вызов pow заменяется на её результат - четвёрку, т.к. она уже отработала и возвратила результат. Так что в этой функции (в первой, =2,n=3) это выражение становится таким : x*4. X заменяется на число : 2*4. После этого считается значение выражение (восемь) и функция возвращает результат. Им является восьмёрка.
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
26.01.2012, 07:42
|
![Аватар для function](https://javascript.ru/forum/image.php?u=18072&dateline=1325850136) |
Говнокодер со стажем
|
|
Регистрация: 06.01.2012
Сообщений: 164
|
|
Спасибо, конечно, за объяснение, но это я знал до этого. НО. Почему
return (n != 1) ? x*pow(x,n-1) : x;
равно
if( n == 1 ) {
return x;
} else {
return x*pow(x, n-1)
}
?
Ведь в 1 примере происходит сравнение (n != 1) с x*pow(x,n-1), и если оно верно возвращается х.
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
26.01.2012, 08:03
|
С++/C# modest developer
|
|
Регистрация: 07.11.2011
Сообщений: 244
|
|
Сообщение от function
|
Ведь в 1 примере происходит сравнение (n != 1) с x*pow(x,n-1), и если оно верно возвращается х.
|
вы видимо не понимаете смысл краткой формы записи условного оператора. В условии производится сравнение не (n != 1) с x*pow(x,n-1) как вы сказали, а n с 1, следовательно если условие выполняется, функция возвращает свой 1-й аргумент, в противном случае возвращает результат выражения
x*pow(x, n-1)
Поэтому
return (n != 1) ? x*pow(x,n-1) : x;
будет аналогично
if( n == 1 ) {
return x;
} else {
return x*pow(x, n-1);
}
или
if( n != 1 ) {
return x*pow(x, n-1);
} else {
return x;
}
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
26.01.2012, 08:48
|
![Аватар для function](https://javascript.ru/forum/image.php?u=18072&dateline=1325850136) |
Говнокодер со стажем
|
|
Регистрация: 06.01.2012
Сообщений: 164
|
|
Ааа... Ясно. Просто я всегда с if работаю а ? ток пробежал взглядом и всё.
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
26.01.2012, 08:50
|
![Аватар для function](https://javascript.ru/forum/image.php?u=18072&dateline=1325850136) |
Говнокодер со стажем
|
|
Регистрация: 06.01.2012
Сообщений: 164
|
|
Всем спасибо за помощь.
|
|
|
|