Функция возведения в степень через цикл
Всем привет. Начал постигать примудрости джс.
На практике столкнулся с таким вот примером вычисления експоненты: 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, время: 06:32. |