2010-12-14 119 views
10

的我有以下的代碼,但它是不會放棄的階乘完美的結果u能找到它PLZ階乘一些

<!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 – 2010-12-14 10:29:49

+0

https://jsfiddle.net/mohittadhiyal/6w64x0sL/10/ – Mohit 2018-03-01 09:41:51

回答

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 2010-12-14 10:38:15

+0

遞歸算法沒有基本情況。非遞歸函數也是錯誤的。 – dheerosaur 2010-12-14 10:42:25

+0

@dheerosaur:是的,對於遞歸算法,修復了這個問題(對我來說還早呢))。但爲什麼非遞歸錯誤?它適用於我(請參閱http://jsfiddle.net/fgpPJ/1/)@Mihir:現在可以使用。 – 2010-12-14 10:44:19

2
  1. 你的函數不返回任何東西,直到永遠。
  2. x是0時你會做什麼?
  3. 小問題 - 除了alert之外,您不會對返回的值做任何事情。

試試這個,如果你(在文本上懸停):

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

工作例如:http://jsbin.com/apuka3/2

+0

如何創建懸停影響? – Tomas 2010-12-14 10:42:40

+0

@Tomas:用'>!'開始行 - http://meta.stackexchange.com/questions/1191/add-markdown-support-for-hidden-until-you-click-text-aka-spoilers – Kobi 2010-12-14 10:43:42

0

該功能的重要部分是這一行:

x = x * fact(x-1); 

fact函數沒有返回值,所以這與x * undefined相同。嘗試將return x;添加到函數的底部。

1

Y首先,您的功能需要有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

@all謝謝你這麼多人..保持搖擺.. – Mihir 2010-12-14 10:50:03

0

輕微編輯到Anton的代碼:

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

} 

(負的階乘不存在,但0階乘等於1,在這種如果一個數字小於0,該函數將返回空值)

+0

'==='這是什麼意思?,改變它... – 2010-12-14 11:13:14

+0

@JavedAkram請[這個問題](http:// stackoverflow。com/q/359494/535122)瞭解'==='的含義。 – Dan 2013-07-08 10:19:38

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

這是一個我用一個while循環做:

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

對於給定的'num',mem [x]不會被重新訪問。所以這不是DP,只是簡單的記憶/緩存。 – 2017-03-22 19:29:22

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

alert(factorial(5)); 

您可以嘗試使用遞歸方法

+0

https://jsfiddle.net/mohittadhiyal/6w64x0sL/10/ – Mohit 2018-03-01 09:42:01

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

你的答案會更好一些解釋。點擊左下方的編輯鏈接。 – 2017-05-29 03:31:47

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

上述第一代碼定義兩個變量,factorialNumberfactorialfactorial初始化爲1. factorialNumber將得到prompt(預期數字)的結果,然後在每個步驟中使用一個循環,將階乘與步驟的索引相乘,該索引由i表示。成功計算後,我們使用alert顯示結果。

+3

請向您的代碼添加說明。代碼只有回答一般皺起了眉頭 – Icepickle 2017-06-24 14:42:47

+0

我的代碼如何?好嗎?雙幫嗎?我檢查了它不壞你的想法是什麼?順便說一句,我17歲 – 2017-06-24 19:06:35

+2

這很好,但是,這與其他一些答案沒有什麼不同。我的評論主要是人們喜歡在一個工作示例旁邊解釋代碼的作用 – Icepickle 2017-06-24 19:32:02

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變量作爲佔位符。

在do循環中,您接着是另一個變量,即產品,它佔用您的佔位符變量並通過輸入對其進行計時。在這之後,輸入遞減,只要輸入值大於零,循環就會繼續迭代。

然後在最後,它將答案發布到表中的'answer'id標籤。