Функция возведения в степень через цикл
Всем привет. Начал постигать примудрости джс.
На практике столкнулся с таким вот примером вычисления експоненты:
function exp(a, b) {
if (b === 0) {
return 1;
}
return a*exp(a, b-1);
}
Скрипт разобрал, понял :) Хотя вначале были сложностит с понимаем схемы, когда функция возвращает сама себя. Попробовал переделать через обычный цикл, чтобы "закрепить", так сказать :) и наткнулся на проблемы.
function exp(a, b) {
if (b === 0) {
return 1;
}
for (b; b < 1; b--) {
a = a*a;
}
return a;
}
Этот вариант всегда возвращет значение a, кроме когда b === 0. То есть проверка первая работает, а вот в цикле какой-то сбой. Чуток помучившись, все же получил результат.
function exp(a, b) {
if (b === 0) {
return 1;
}
do {
a = a*a;
b--;
} while (b > 1);
return a;
}
Но почему этот вариант работает, а предыдущий нет, так и не понял. Буду благодарен за объяснения. |
Цитата:
Цитата:
function exp(a, b) {
if (b === 0) {
return 1;
}
do {
a = a*a;
b--;
} while (b > 1);
return a;
}
alert( exp(2, 5) )
С каких это пор 2^5 = 65536? |
Да. Вы правы. Через do while тоже неправильно отображает..
Кто-то натолкнет на мысль? Вроде все логично.. - Задаем функцию с двумя парамметрами. - проверяем "b" на идентичность нулю. - Пускаем do/while, который с каждым циклом перемножает "a" на себя же, а "b" уменьшает на единицу . Цикл работает пока "b" не станет равным нулю. После этого идет возврат "a"/ В чем моя ошибка?:blink: |
Возьмите ручку, листочек бумаги и пройдитесь по своему коду, представив себя интерпретатором.
|
Спасибо. Последовал совету и разобрался))
function exp(a, b) {
var i = a;
if (b === 0) {
return 1;
}
if (b === 1) {
return a;
}
for (; b > 1; b--){
i = i*a;
}
return i;
}
alert(exp(2,5));
|
| Часовой пояс GMT +3, время: 12:11. |