Работа рекурсии
Привет, люди. Читал ваш учебник и наткнулся на рекурсию...
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 вопрос. Когда дело доходит до запуска новой функции, старая останавливается и ждёт результата? |
1. что она перестаёт сравнивать.. и что она может вывести? она только возвращает результат. я вас не понял.
2. да, т.к. js - однопоточный язык. |
Когда n становится равно 1, значение (n != 1) выдаёт false. Далее идёт сравнение с x*pow(x,n-1). Эта функция не запускается, чтобы вычислить значение, и каким-то чудесным образом это сравнение даёт true...
|
Когда 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, её сначало надо выполнить.)
|
Спасибо, конечно, за объяснение, но это я знал до этого. НО. Почему
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), и если оно верно возвращается х. |
Цитата:
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; } |
Ааа... Ясно. Просто я всегда с if работаю а ? ток пробежал взглядом и всё.
|
Всем спасибо за помощь.
|
Часовой пояс GMT +3, время: 22:49. |