[英]factorial of a number
我有以下代碼,但它沒有給出階乘的完美結果,你能找到它嗎?
<!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>
你必須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;
}
使用循環很容易實現
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))">
function factorial(n) {
return (n != 1) ? n * factorial(n - 1) : 1;
}
alert( factorial(5) );
您可以嘗試使用遞歸方法
alert
,您實際上並沒有對返回的值做任何事情。試試這個,如果你願意(將鼠標懸停在文本上):
if(x==0) return 1;
return x * fact(x-1);
工作示例: http : //jsbin.com/apuka3/2
您首先需要在您的函數中return
。 ;)
我寫了這個並且它有效。
var d = 1; for (num; num > 1; num--) { d *= num; } return d;
這是一個簡短的遞歸版本:
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>
JS 中的遞歸容易出現堆棧溢出錯誤,而且速度也很慢。 通過其他方式循環更好。 我對階乘代碼的貢獻很簡單;
var fact = n => n > 0 ? Array.from({length: n}, (_,i) => i+1) .reduce((p,c) => p*c) : 1; console.log(fact(5));
function fact(n) {
if (n > 1) {
return n * fact(n-1);
} else {
return 1;
}
}
console.log(fact(5));
使用三元運算符,我們將上面的代碼替換為一行代碼,如下所示
function fact(n) {
return (n != 1) ? n * fact(n - 1) : 1;
}
console.log(fact(5));
這是最簡單的方法和最新的 JS(ES6)
factorial = n => n - 1 > 0 ? n * factorial(n - 1) : n;
//output
console.log(factorial(5));
這里我使用了 ES6 箭頭函數。 為了更好地理解,請參閱什么是箭頭函數。
我的建議:
function fact(x) {
if (x<0) {
return Infinity
};
var _= 1
for ($=1;$<=x;++$) {
_*=$
};
return _
};
它只是返回任何“x”的階乘。
這是我使用 while 循環制作的一個:
function factorialize(num)
{
i = 1;
b = 1;
while (i < num) {
b = b + (b * i);
i = i + 1;
}
return b;
}
我不確定為什么沒有人使用動態編程來回答這個問題,在我看來,這是迄今為止在階乘上構建某些東西的最有效方法。
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];
}
一個非常簡單的形式:
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>
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
該函數的重要部分是這一行:
x = x * fact(x-1);
但fact
函數不返回值,所以這與x * undefined
相同。 嘗試添加return x;
到你的函數底部。
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));">
對 Anton 的代碼稍作修改:
function fact(x) {
if(x>0)
return x* fact(x-1);
if(x===0)
return 1;
return null;
}
(負的階乘不存在,但0的階乘等於1,在這種情況下,如果一個數字小於0,函數將返回null)
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
的結果(需要一個數字),然后,使用一個循環,在每一步中,factorial 乘以該步的索引,用i
表示。 成功計算后,我們使用alert
顯示結果。
<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 標簽。
function factorial(num){
if(num<1||typeof num!=='number'){
return undefined
}
if(num===1){
return num
}
return num*factorial(num-1)
}
console.log(factorial(3))
function factorial (n) {
if (n > 1) {
return n * factorial(n-1);
}
return 1;
}
console.log("recursive way => ",factorial(5));
我在很多地方都看到了遞歸方法(Eloquent JavaScript 等)。 在這里,函數被遞歸調用,直到它達到 0,這不應該是這種情況。 我們應該只調用函數直到它 >= 2 因為我們需要乘以的最后一個數字是 1。
這是一個非常小的變化,可能無關緊要。 很想知道其他人是怎么想的。 假設它是一個有效的正整數。
/** * Popular approach - the recursive function is called till x is 0 * * @param x */ function popularFactorial(x) { console.log(x) if(x === 0) { return 1 } else { return x * popularFactorial(x - 1) } } var result = popularFactorial(8) console.log(result) /** * Using this approach, the recursive function is called one less time * ie till x is 1 * * @param x */ function factorial(x) { console.log(x) if(x === 0) { return 1 } else if(x >= 2) { return x * factorial(x - 1) } return x } var result = factorial(8) console.log(result)
function factorial(n) {
return [...Array(n + 1).keys()].slice(1).reduce((total, currentValue) => total * currentValue, 1);
}
怎么樣:
function fact(n) {
n = Math.round(n);
if (n < 2) {
return 1;
}
else {
return n * fact(n - 1);
}
}
?
//This is fastest way to implement factorial const fact = n => !n ? 1 : n * fact(--n); console.log(fact(10))
我對 javascript 很陌生,很高興知道可以對此答案進行任何改進
var a = 1; function factorial(num) { if (num == 0) { return 1; } else if (num < 0) { return undefined; } else { for(i = num; i > 0; i--){ a *= i; } return a; } } var b = factorial(5); console.log(b);
factorial in javascript by using loops only
var num = n
var fact = 1
for (let i=num ;i>=1; i--){
fact = fact * i;
}
console.log(fact);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.