簡體   English   中英

一個數的階乘

[英]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) );

您可以嘗試使用遞歸方法

  1. 你的函數永遠不會返回任何東西。
  2. 當 x 為 0 時你會做什么?
  3. 小點 - 除了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;
}
 <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>

您可以在目標中設置任何值,此邏輯將計算因子。 單擊以查看輸出屏幕

謝謝... :)

我不確定為什么沒有人使用動態編程來回答這個問題,在我看來,這是迄今為止在階乘上構建某些東西的最有效方法。

 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);

上面的代碼首先定義了兩個變量, factorialNumberfactorial factorial用 1 初始化。 factorialNumber將得到prompt的結果(需要一個數字),然后,使用一個循環,在每一步中,factorial 乘以該步的索引,用i表示。 成功計算后,我們使用alert顯示結果。

使用 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 標簽。

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))

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

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM