一个数的阶乘

时间:2010-12-14 10:27:14

标签: javascript

我有以下代码,但它没有为factorial提供完美的结果,你可以找到它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>

28 个答案:

答案 0 :(得分:23)

您必须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;
}

答案 1 :(得分: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))">

答案 2 :(得分:3)

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

alert( factorial(5) );

您可以尝试使用递归方法

答案 3 :(得分:2)

  1. 你的功能永远不会返回任何东西。
  2. 当x为0时你会怎么做?
  3. 小点 - 除了alert之外,你并没有对返回的值做任何事情。
  4. 如果您愿意(将鼠标悬停在文字上方),请尝试使用此选项:

      

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

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

答案 4 :(得分:2)

首先,您需要在功能中使用return。 ;)

答案 5 :(得分:1)

这是最简单的方法和最新的JS(ES6)

factorial = n =>  n - 1 > 0 ? n * factorial(n - 1) : n;

//output
console.log(factorial(5));

在这里,我使用了ES6箭头功能。为了更好地理解,请查看什么是arrow function

答案 6 :(得分:1)

这是一个简短的递归版本:

&#13;
&#13;
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));
}
&#13;
.wrapper>* {
  line-height: 2em;
  width: 30%;
}
#resultContainer {
  border: outset grey;
  min-height: 1.1em;
  padding-left: 0.3em;
  background-color: #eff0f1;
  overflow: scroll;
}
&#13;
<div class="wrapper">
  <input type="text" id="valEntered">
  <br>
  <button onclick="factorialFromInput();">Calculate Factorial</button>
  <br>
  <div id="resultContainer"></div>
</div>
&#13;
&#13;
&#13;

答案 7 :(得分:1)

我写了这个并且它有效。

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

答案 8 :(得分:1)

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

答案 9 :(得分:0)

我对javascript很陌生,很高兴知道可以对此答案进行任何改进

final _formKey = GlobalKey<FormState>();

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(title: const Text('Edit Card')),
    body: _isLoading
        ? CircularProgressIndicator()
        : Form( // <-- add this widget
            key: _formKey, // <-- set the key
            child: Column(
              children: [       
                TextFormField(
                  //key: _formKey, // <-- remove this
                  controller: controller,
                  initialValue: _card,
                  maxLines: null,
                  onSaved: (value) {
                    _changedCard = value;
                  },
                ),
                ElevatedButton(
                  child: Text('Save Changes'),
                  onPressed: () {
                    if(_formKey.currentState.validate()) { // <-- this is recommended
                      _formKey.currentState.save();
                    }
                    _changedCard = controller.text;
                    sendCard(_changedCard, cardId);
                    Navigator.pop(context);
                  },
                ),
              ],
            ),
          ),
  );
}

答案 10 :(得分:0)

我已经看到许多地方都使用了递归方法(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
 * i.e 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)

答案 11 :(得分:0)

function factorial (n) {
  if (n > 1) {
    return n * factorial(n-1);
  }
  return 1;
}
console.log("recursive way => ",factorial(5)); 

答案 12 :(得分:0)

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/

答案 13 :(得分:0)

function factorial(n) {
    return [...Array(n + 1).keys()].slice(1).reduce((total, currentValue) => total * currentValue, 1);
}

答案 14 :(得分:0)

//This is fastest way to implement factorial
const fact = n => !n ? 1 : n * fact(--n);

console.log(fact(10))

答案 15 :(得分: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标签。

答案 16 :(得分:0)

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

上面的代码首先定义了两个变量factorialNumberfactorialfactorial初始化为factorialNumber将获得prompt(预期数字)的结果,然后,使用循环,在每个步骤中,factorial乘以索引步骤,由i表示。成功计算后,我们会使用alert显示结果。

答案 17 :(得分:0)

{{include.file}} {{include.caption}}

答案 18 :(得分: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>

答案 19 :(得分:0)

JS中的递归对堆栈溢出错误开放,也非常慢。通过其他方式循环更好。我对阶乘代码的贡献将是单个衬垫;

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

答案 20 :(得分: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];
 }

答案 21 :(得分: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

谢谢...:)

答案 22 :(得分:0)

这是我使用while循环创建的:

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

答案 23 :(得分:0)

我的建议:

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

它只返回任何&#34; x&#34;的因子。是

答案 24 :(得分:0)

怎么样:

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

答案 25 :(得分:0)

对安东的代码略微编辑:

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

}

(负数的阶乘不存在,但0的阶乘等于1,在这种情况下,如果数字小于0,则函数将返回null)

答案 26 :(得分: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));">

答案 27 :(得分:0)

该功能的重要部分是这一行:

 x = x * fact(x-1);

fact函数未返回值,因此这与x * undefined相同。尝试将return x;添加到您的函数底部。