2010-12-14 2 views
10

У меня есть следующий код, но он не дает идеальный результат для факториала может у найти его плзФакториал числа

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
    <title> New Document </title> 
    <script type="text/javascript"> 
function fact(num) 
{ 
    var x=parseInt(num); 
    //alert(x+1); 
    if(x>0) 
     x=x* fact(x-1); 
    alert(x); 
} 
    </script> 
</head> 

<body> 
<form name="f1"> 
    Enter the Number :<input type="text" length="8" name="txt1"><br> 
    <input type="button" value="Find factiorial" onclick="fact(txt1.value)"> 
    </form> 
</body> 
</html> 
+0

http://stackoverflow.com/search?q=javascript+factorial –

+0

https://jsfiddle.net/mohittadhiyal/6w64x0sL/10/ – Mohit

ответ

21

У вас должно быть return значение. Здесь вы идете:

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

function run(number) { 
    alert(fact(parseInt(number, 10))); 
} 

и

<input type="button" value="Find factiorial" onclick="run(txt1.value)"> 

(Как заставить его работать на отрицательных чисел я оставляю за вами;) (но я показал в этом посте все равно))

Просто для удовольствия, более правильно, не рекурсивный алгоритм:

function fact(x) { 
     if(x == 0) { 
      return 1; 
     } 
     if(x < 0) { 
      return undefined; 
     } 
     for(var i = x; --i;) { 
      x *= i; 
     } 
     return x; 
} 
+0

, но он отображается как NaN .. – Mihir

+0

Рекурсивный алгоритм не имеет базового случая. Нерекурсивная функция также неверна. – dheerosaur

+0

@dheerosaur: Да, для рекурсивного алгоритма исправлено (еще рано для меня;)). Но почему нерекурсивная ошибка? Он работает для меня (см. Здесь http://jsfiddle.net/fgpPJ/1/) @Mihir: Он работает сейчас. –

2
  1. Ваша функция не возвращает ничего, никогда.
  2. Что вы делаете, когда x равно 0?
  3. Незначительный пункт - кроме alert, вы действительно ничего не делаете с возвращенным значением.

Попробуйте это вместо того, чтобы, если вы (парения над текстом):

if(x==0) return 1;
return x * fact(x-1);

Рабочий пример: http://jsbin.com/apuka3/2

+0

Как создать парения эффект? – Tomas

+0

@ Томас: запустите строку с '>!' - http://meta.stackexchange.com/questions/1191/add-markdown-support-for-hidden-until-you-click-text-aka-spoilers – Kobi

0

Важной частью функции является эта линия:

x = x * fact(x-1); 

, но функция fact не возвращает значение, поэтому это то же самое, что и x * undefined. Попробуйте добавить return x; в нижней части вашей функции.

1

Y ou необходимо иметь return в вашей функции в первую очередь.;)

0

1) Когда функция X = 0 должна возвращать 1; 2) Добавлен возврат;

function fact(num) 
{ 
    var x=parseInt(num); 
    //alert(x+1); 
    if(x>0) 
     x=x* fact(x-1); 
    else 
     x=1; 
    return x; 
} 

использование

<input type="button" value="Find factiorial" onclick="alert(run(fact.value));"> 
+0

@ большое спасибо вам, ребята .. продолжайте качать .. – Mihir

0

Незначительное редактировать закодировать Антона:

function fact(x) { 
    if(x>0) 
     return x* fact(x-1); 
    if(x===0) 
     return 1; 
    return null; 

} 

(факторный негатива не существует, но факториал 0 равен 1, в этом случай, если число меньше 0, функция вернет значение null)

+0

'===' что это значит ?, изменить его ... –

+0

@JavedAkram Пожалуйста, [этот вопрос] (http: // stackoverflow.com/q/359494/535122), чтобы понять, что означает '==='. – Dan

5

Использовать цикл его легко реализовать

function fact(num) 
{ 
    if(num<0) 
    return "Undefined"; 
    var fact=1; 
    for(var i=num;i>1;i--) 
     fact*=i; 
    return fact; 
} 

<input type="button" value="Find factiorial" onclick="alert(fact(6))"> 
0

насчет:

function fact(n) { 
    n = Math.round(n); 
    if (n < 2) { 
    return 1; 
    } 
    else { 
    return n * fact(n - 1); 
    } 
} 

?

0

Мое предложение:

function fact(x) { 
    if (x<0) { 
     return Infinity 
    }; 
    var _= 1 
    for ($=1;$<=x;++$) { 
     _*=$ 
    }; 
    return _ 
}; 

Он просто возвращает факториал любой "х".

0

Вот один я сделал, используя время цикла:

function factorialize(num) 
{ 
    i = 1; 
    b = 1; 
    while (i < num) { 
    b = b + (b * i); 
    i = i + 1; 
    } 
return b; 
} 
1

Я написал это, и это работает.

var d = 1; 
 
    for (num; num > 1; num--) { 
 
    d *= num; 
 
    } 
 
    return d;

0
<script src="jquery-3.1.0.js"></script> 
<script> 
    $(function() { 
     var target = 5; 
     var factorial = 1; 
     for (var i = 1; i <= target; i++) { 
      factorial *= i; 
     } 
     alert(factorial); 
     }); 
</script> 

вы можете установить любое значение в цель и эта логика будет вычислять Факториал. click to see output screen

Спасибо ... :)

0

Я не знаю, почему никто не использовал динамического программирования, чтобы ответить на это, это, безусловно, наиболее эффективным способом, чтобы построить что-то на факториала, на мой взгляд.

var mem = []; 

function fact(num) 
{ 
    var x = parseInt(num); 

    if (x == 0 || x == 1) return 1; 

    mem[x] = x * fact(x-1); 

    return mem[x]; 
} 
+1

mem [x] не запрашивается повторно для данного 'num'. Так что это не DP, просто простая memoize/кеширование. –

3
function factorial(n) { 
    return (n != 1) ? n * factorial(n - 1) : 1; 
} 

alert(factorial(5)); 

Вы можете попробовать использовать метод рекурсии

+0

https://jsfiddle.net/mohittadhiyal/6w64x0sL/10/ – Mohit

1

Вот краткий рекурсивная версия:

function doFact(n) { 
 
    return +!(+(n)) || doFact(n - 1) * n; 
 
} 
 

 
function factorialFromInput() { 
 
    var theInputVal = document.getElementsByTagName("input")[0].value; 
 
    var theContainer = document.getElementById("resultContainer"); 
 
    theContainer.innerHTML = "" + doFact(Math.abs(theInputVal)); 
 
}
.wrapper>* { 
 
    line-height: 2em; 
 
    width: 30%; 
 
} 
 
#resultContainer { 
 
    border: outset grey; 
 
    min-height: 1.1em; 
 
    padding-left: 0.3em; 
 
    background-color: #eff0f1; 
 
    overflow: scroll; 
 
}
<div class="wrapper"> 
 
    <input type="text" id="valEntered"> 
 
    <br> 
 
    <button onclick="factorialFromInput();">Calculate Factorial</button> 
 
    <br> 
 
    <div id="resultContainer"></div> 
 
</div>

0

Рекурсия в JS открыт стек ошибка переполнения и также очень медленно. Лучше использовать петлю другими способами.Мой вклад в факторный код был бы одним лайнером;

var fact = n => Array(n).fill().reduce((v,_,i) => (i+1) * v || 2); 
 
console.log(fact(5));

0

очень простой форме:

function fact() { 
    var x = document.getElementById("txtf").value; 
    var f=1; 
    for (var i=1; i <= x ; i++){ 
     f = f*i; 
    } 
    document.getElementById('showR').innerHTML= f; 
} 


<input type="text" id="txtf" value="3"> 
    <input type="button" id="btnf" value="click for calculate" onclick="fact()"> 
    <p id="showR">/Factoriel/</p> 
0
function factorial(num) { 

    var result = 1; 

    for (var i = 1; i <= num; i++) { 
     result = result * i; 

    } 

    return result; 
} 
//call function e.g factorial(4).. 1*2*3*4 it will evaluate in ascending order 
+3

Ваш ответ будет лучше с некоторыми объяснениями. Нажмите на ссылку редактирования внизу слева. –

0
var factorialNumber , factorial=1; 
factorialNumber=prompt("Factorial Number" , "write Factorial Number"); 
for(var i = 1; i<= factorialNumber;i++){ 
    factorial *= i; 
} 
alert(factorial); 

Код выше первого определяет две переменные, factorialNumber и factorial. factorial инициализируется 1. factorialNumber получит результат prompt (ожидается число), а затем, используя цикл, на каждом шаге факториал умножается на индекс шага, который представлен i. При успешном вычислении мы показываем результат с использованием alert.

+3

Пожалуйста, введите код. Только ответы на код, как правило, не одобряются – Icepickle

+0

Как мой код? это хорошо? Помог ли би? Я проверил, что это не так. Что вы думаете? Кстати, мне 17 лет –

+2

Это прекрасно, однако, это не что иное, как некоторые другие ответы здесь. Мое замечание состояло в основном в том, что людям нравится объяснять, что делает код, рядом с рабочим примером – Icepickle

0

С петлей Do это довольно легко.

<table> 
    <tr> 
     <th>Amount of integers</th> 
     <th>Answer</th> 
    </tr> 
    <tr> 
     <th><input id="int" type="number"/></th> 
     <th><input id="answer" type="number"/></th> 
    </tr> 
</table> 
<button onclick="calculate()">calculate</button> 
<script> 
    function calculate() { 
     var input = document.getElementById("int").value; 
     var int = 1; 

     do { 
      var product = int *= input; 
      input--; 
     } while (input > 0); 
     answer.value = product; 
    } 
</script> 

Сначала вы установили таблицу, чтобы действовать как способ ввода переменной и иметь место для вывода ответа. Вы также добавляете кнопку для выполнения своей функции.

Входная переменная - это значение, введенное пользователем. У вас также есть int variable в качестве заполнителя.

Внутри цикла do вы затем еще одна переменная, являющаяся продуктом, она принимает переменную вашего заполнителя и умножает ее на вход. После этого входные декременты, пока входное значение больше нуля, цикл продолжает итерацию.

Затем в конце он отправляет ответ на тег идентификатора «ответ» в таблице.

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