Использование:
for(var i = num - 1; i > 0; i--) {
return num * i;
}
Это будет возвращать num*(num-1)
значение. Так как он вернет значение в первой итерации.
Вместо этого используйте:
Использование рекурсии:
function FirstFactorial(num) {
if(num==1)
return num;
else
return num*(FirstFactorial(num-1))
}
или:
fact=num;
for(var i = num - 1; i > 0; i--) {
fact*=i;
}
return fact;
EDIT: По требованию О.П., чтобы объяснить, как возвращение будет работать в методе рекурсивного ,
Что касается рекурсии:
return num*FirstFactorial(num-1)
фактически первый умножает num
с возвращаемым значением FirstFactorial(num-1)
который будет (n-1)!
. Следовательно, что на самом деле произойдет:
FirstFactorial(num-1)
называется. (Первая факториальная функция вызывается с параметром num-1
.
- Возвращаемое значение
FirstFactorial(num-1)
, которое равно (num-1)!
, умножается на значение num
для получения num!
.
- Это значение (
num!
) затем возвращается функцией FirstFactorial()
при передаче с параметром num
или FirstFactorial(num)
Теперь о вызове FirstFactorial(num-1)
внутри FirstFactorial(num)
, FirstFactorial функция снова будет выполнена проверка первого, если условие. Если он терпит неудачу, он вернет значение (n-1)*FirstFactorial(num-1 - 1)
. Это будет возвращено до тех пор, пока условие не будет удовлетворено, и значение будет возвращено без повторного вызова FirstFactorial
.
Вы также можете думать, как функция:
function FirstFactorial(num) {
if(num==1)
return num;
else {
a = FirstFactorial(num-1);
a = a * num;
return a;
}
}
Вы прерывание для цикла с вашим возвращением заявления. Вам нужно вернуться за пределы цикла. – nhaarman