Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Работа рекурсии (https://javascript.ru/forum/misc/25112-rabota-rekursii.html)

function 25.01.2012 22:04

Работа рекурсии
 
Привет, люди. Читал ваш учебник и наткнулся на рекурсию...

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 вопрос. Когда дело доходит до запуска новой функции, старая останавливается и ждёт результата?

melky 25.01.2012 22:07

1. что она перестаёт сравнивать.. и что она может вывести? она только возвращает результат. я вас не понял.
2. да, т.к. js - однопоточный язык.

function 25.01.2012 22:14

Когда n становится равно 1, значение (n != 1) выдаёт false. Далее идёт сравнение с x*pow(x,n-1). Эта функция не запускается, чтобы вычислить значение, и каким-то чудесным образом это сравнение даёт true...

melky 25.01.2012 22:43

Когда 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. ( не нужное предложение :write:)
  • после того, как второй вызов (в ней x=2,n=2) возвращает результат (четвёрка), в её выражении x*pow(x,n-1) вызов pow заменяется на её результат - четвёрку, т.к. она уже отработала и возвратила результат. Так что в этой функции (в первой, =2,n=3) это выражение становится таким : x*4. X заменяется на число : 2*4. После этого считается значение выражение (восемь) и функция возвращает результат. Им является восьмёрка.

function 26.01.2012 07:42

Спасибо, конечно, за объяснение, но это я знал до этого. НО. Почему
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), и если оно верно возвращается х.

nekto_O 26.01.2012 08:03

Цитата:

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

function 26.01.2012 08:48

Ааа... Ясно. Просто я всегда с if работаю а ? ток пробежал взглядом и всё.

function 26.01.2012 08:50

Всем спасибо за помощь.


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