2015-03-30 3 views
1

Я новичок в javascript, и мне сложно определить, как заставить эту факторную функцию работать. Вот мой код сейчас.Определение факториала числа

var x = prompt("Enter a number"); { 
    function fact(x) { 
     if (x < 0) { 
     return ("Enter a positive integer"); 
     } 
     else { 
     return (x * fact(x-1)) 
     } 
    } 
    } 
    var result = fact(x) 
    document.write("The factorial of" + x + "is" + result); 

Спасибо за помощь!

+2

Похоже, вы еще умножения чисел при х = 0 Кроме того, каковы ваши скобки после первой строки 'var'? –

+0

да, результат возврата для вашего базового футляра (x = 0), и все будет хорошо –

ответ

1

Ваше определение факторного не так. Традиционное рекурсивное определение факториала:

F(x) => x == 1 ? 1 : x * F(x-1) 

Или вы можете использовать итерационный и е

F(x) => var i = 1; for (j = 1..x) i = i * j 

В JavaScript, рекурсивная версия будет:

function factorial (x) { 
    if (x == 1) return x; 
    return x * factorial(x-1); 
} 

итеративный версия будет :

function factorial (x) { 
    var result = 1; 
    for (var y = 1; y <= x; y++) { 
     result = result * y; 
    } 
    return result; 
} 

Вы можете добавить проверку отрицательных чисел в вышеуказанные функции. Но, на мой взгляд, это заслонит цель функции (которая заключается в реализации традиционного определения факториала). Лучшим подходом является перемещение отрицательного числа if() за пределами факториальной функции. Проверка if (x < 0) имеет свою собственную цель, которая не зависит от расчета факториалов: проверка ввода.

2

Ваш базовый футляр неверен для рекурсивного факториала. изменить его на

function fact(x) { 
    if (x <= 1) { 
     return 1 
    } 
    else { 
     return (x * fact(x-1)) 
    } 
} 
1

В каждой рекурсивной функции существует условие остановки (в вашем случае его if(x<=1)), без которого функция перейдет к бесконечной рекурсии. Вы не добавили этого условия остановки. Ниже приводится обновленная программа работает:

var x = prompt("Enter a number"); { 
    function fact(x) { 
     if (x < 0) { 
     return ("Enter a positive integer"); 
     } 
     else if(x <=1){ 
     return 1; 
     } 
     else { 
     return (x * fact(x-1)) 
     } 
    } 
    } 
    var result = fact(x) 
    document.write("The factorial of " + x + " is " + result); 
0

В дополнение к фиксации недостатки алгоритма, я рекомендую переместив строку в свою собственную функцию для разделения проблем.

Мне также нравится идея использования while заявления для этого, а также делать parseInt на входе:

function fact(x) { 
 
    while (x > 1) { 
 
     return (x * fact(x-1)); 
 
    } 
 
    return x; 
 
} 
 
function doFact() { 
 
    var x = parseInt(prompt("Enter a positive integer")); 
 
    if (x < 1) { 
 
     doFact(); 
 
    } else { 
 
     var result = fact(x); 
 
     alert("The factorial of " + x + " is " + result); 
 
    } 
 
} 
 
doFact();

Смежные вопросы