在Javascript中编写组合和置换计算器的最有效方法

Jus*_*tin 7 javascript

我有一个数学网站http://finitehelp.com,教授学生有限数学.我认为包含一个计算器会很酷,所以我在Javascript中为组合和排列做了一个.实时计算器位于http://finitehelp.com/finite-calculator.html.我对Javascript几乎一无所知,并且冒昧地猜测有一种更有效的方式来编写以下内容,特别是因为过度使用了变量.如果有人能帮助我,我会非常感激.

<script type="text/javascript">
// calculate n!
Math.factorial = function(n)
{
    if(typeof n == 'string') n = Number(n);
    if(typeof n != 'number' || isNaN(n))
    {
        alert("Factorial requires a numeric argument.");
        return null;
    }
    if (n < 2) return 1;
    return (n * Math.factorial(n-1));
}
Math.divide = function(a,b)
{
    return a/b;
}
</script>

<form class="form" name="combination" action="">
    <p>C(<input type="text" value="n" name="T1" size="1">,<input type="text" value="r" name="T2" size="1">)
    <input type="button" value="Calculate"
     onclick="var n = T1.value; var r = T2.value; var n_minus_r = parseFloat(n) - parseFloat(r); var numerator = Math.factorial(T1.value); var n_minus_r_fact = Math.factorial(n_minus_r); var r_fact = Math.factorial(r); var denominator = n_minus_r_fact * r_fact; T3.value = Math.divide(numerator,denominator); return true;">
    = <input type="text" name="T3" size="12" readonly></p>
</form>
Run Code Online (Sandbox Code Playgroud)

Ble*_*der 6

好吧,我们开始吧!

首先,你为什么需要写这个?

Math.divide = function(a,b)
{
    return a/b;
}
Run Code Online (Sandbox Code Playgroud)

我会完全废除它。

您还可以清理一下Math.factorial

Math.factorial = function(n)
{
    n = Number(n);

    if (isNAN(n)) {
        alert("Factorial requires a numeric argument.");
        return null;
    } else if (n < 2) {
        return 1;
    } else {
        return (n * Math.factorial(n - 1));
    }
}
Run Code Online (Sandbox Code Playgroud)

但主要问题是你的onclick()代码:

onclick="var n = T1.value; var r = T2.value; var n_minus_r = parseFloat(n) - parseFloat(r); var numerator = Math.factorial(T1.value); var n_minus_r_fact = Math.factorial(n_minus_r); var r_fact = Math.factorial(r); var denominator = n_minus_r_fact * r_fact; T3.value = Math.divide(numerator,denominator); return true;
Run Code Online (Sandbox Code Playgroud)

复杂了。我将其设置为一个函数并将其绑定到元素,这将消除 HTML 中的所有废话并使其更易于使用:

window.onload = function()
{
    document.getElementById('calculate').onclick = function() {
        var n = T1.value,
            r = T2.value;

        T3.value = Math.factorial(n) / (Math.factorial(r) * Math.factorial(n - r));
    }
}
Run Code Online (Sandbox Code Playgroud)

并去掉onclick=代码。


Mar*_*sey 5

如果您担心效率,您可能希望将阶乘重新实现为迭代函数而不是递归函数。递归版本将比迭代版本使用更多的内存和 CPU 时间。

function factorial(n) { 
  var x=1; 
  var f=1;
  while (x<=n) {
    f*=x; x++;
  }
    return f;
}
Run Code Online (Sandbox Code Playgroud)

您也不应该将自己的函数添加到 Math 命名空间。这不是一个好习惯。