Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 25.01.2012, 22:04
Аватар для function
Говнокодер со стажем
Отправить личное сообщение для function Посмотреть профиль Найти все сообщения от function
 
Регистрация: 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 вопрос. Когда дело доходит до запуска новой функции, старая останавливается и ждёт результата?
Ответить с цитированием
  #2 (permalink)  
Старый 25.01.2012, 22:07
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

1. что она перестаёт сравнивать.. и что она может вывести? она только возвращает результат. я вас не понял.
2. да, т.к. js - однопоточный язык.
Ответить с цитированием
  #3 (permalink)  
Старый 25.01.2012, 22:14
Аватар для function
Говнокодер со стажем
Отправить личное сообщение для function Посмотреть профиль Найти все сообщения от function
 
Регистрация: 06.01.2012
Сообщений: 164

Когда n становится равно 1, значение (n != 1) выдаёт false. Далее идёт сравнение с x*pow(x,n-1). Эта функция не запускается, чтобы вычислить значение, и каким-то чудесным образом это сравнение даёт true...
Ответить с цитированием
  #4 (permalink)  
Старый 25.01.2012, 22:43
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 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. После этого считается значение выражение (восемь) и функция возвращает результат. Им является восьмёрка.
Ответить с цитированием
  #5 (permalink)  
Старый 26.01.2012, 07:42
Аватар для function
Говнокодер со стажем
Отправить личное сообщение для function Посмотреть профиль Найти все сообщения от function
 
Регистрация: 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), и если оно верно возвращается х.
Ответить с цитированием
  #6 (permalink)  
Старый 26.01.2012, 08:03
С++/C# modest developer
Отправить личное сообщение для nekto_O Посмотреть профиль Найти все сообщения от nekto_O
 
Регистрация: 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;
}
Ответить с цитированием
  #7 (permalink)  
Старый 26.01.2012, 08:48
Аватар для function
Говнокодер со стажем
Отправить личное сообщение для function Посмотреть профиль Найти все сообщения от function
 
Регистрация: 06.01.2012
Сообщений: 164

Ааа... Ясно. Просто я всегда с if работаю а ? ток пробежал взглядом и всё.
Ответить с цитированием
  #8 (permalink)  
Старый 26.01.2012, 08:50
Аватар для function
Говнокодер со стажем
Отправить личное сообщение для function Посмотреть профиль Найти все сообщения от function
 
Регистрация: 06.01.2012
Сообщений: 164

Всем спасибо за помощь.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программист JavaScript постоянная удалённая работа. moisha Работа 4 26.10.2011 19:52
Постоянная работа / Front-end / Москва kooper Работа 4 29.09.2011 22:06
Работа с cookie klubnichkaaa AJAX и COMET 1 26.09.2011 14:06
Это работа, за неё нужно платить деньги... Kolyaj Оффтопик 20 25.01.2011 20:44
небольшая работа - интерфейс в ява скрипте :) int9 Работа 0 08.12.2008 22:51