Что то решил я себя помучить и только осваивая JS, взялся я написать скрипт, который подсчитывал бы факториал и выводит ответ на экран. Потратил часа полтора, но решить не могу. Код несколько раз менялся, в окончательном варианте вышло следующее:
Код:
<script>
var n = prompt('Введите число факториала', 1);
var i = 1;
var s = n;
var factorial;
while (i < n) {
s = s*(s-1);
factorial = s;
i++;
}
alert(factorial);
Но что-то даже в этой редакции он выдает ненормальные значения.
Вчера я нес какую-то фигню. На утро придумалось другое решение данной проблемы. Мне кажется, можно найти более оптимальный путь и если кто-нибудь укажет более оптимальный способ, буду признателен. Пока решение данной задач у меня получилось такое:
Код:
<DOCTYPE HTML>
<HTML>
<head>
<title>Вычисление факториала</title>
<meta charset="utf-8">
</head>
<body>
<p>Скрипт для вычисления факториала</p>
<script>
var n = prompt('Введите число факториала', 1);
var i = 1;
var s = 1;
var p;
while (i < n) {
p = i +1;
s = s * p;
i++;
}
alert(s);
</script>
</body>
</HTML>
<DOCTYPE HTML>
<HTML>
<head>
<title>Вычисление факториала</title>
<meta charset="utf-8">
</head>
<body>
<p>Скрипт для вычисления факториала</p>
<script>
function factorial(n) {
return n ? n * factorial(n - 1) : 1;
}
var n = prompt('Введите число факториала', 1);
alert( factorial(n) );
</script>
</body>
</HTML>
Рекурсия - это когда функция вызывает саму себя! Таким образом мы, по сути, считаем так: n! = n * (n - 1) * (n - 2) * ...*1
Сначала мы создали функцию factorial, которая возвращает 1, если n == 0. Выражение n ? n * factorial(n - 1) : 1; равносильно конструкции if...else. Им мы проверяем n на равенство 0. И проверка эта сводится к тому, что во многих языках программирования на 0 не надо проверять, так как любое ненулевое значение - это истина, иначе - ложь! И в этом выражении если n ? вернет истину, то отработает n * factorial(n - 1), а если n == 0, то будет ложь и тогда отработает правая часть, то есть вернется 1!