2010-12-14 138 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标签。