递归,Sigma表示法(html / javascript)

时间:2012-10-21 21:25:54

标签: javascript function recursion

我的目标是使用递归来获得sigma表示法。上限为n(输入变量)下限为i = 1,函数为(-i)^(i-1)。我得到它与迭代工作,但我不能让递归工作。

<!DOCTYPE html>
<head><title>Recursion</title></head>
<body>
<h1>Recursion</h1>
<script = "text/javascript">
var num
var i;
var n;
var total;
total = 0;
i=0;
var b;
b=0;
function formula(n)
{
(Math.pow((-i),(i-1)))
}

function recursion(n)
{
i=i+1;
if ((n-i) == 0)
{
document.writeln("done");
}
else
{
total = total + recursion(formula(n-i));
return total;

//total = total + (Math.pow((-i),(i-1)) + recursion(n-i));
}
}
num = window.prompt("pick a number");
recursion(num);
document.writeln(recursion(num));
//document.writeln(total);

</script>
</body>
</html>

1 个答案:

答案 0 :(得分:2)

请避免使用任何全局变量,这使得它很难阅读。另外,正确缩进代码;并且不要将输出(document.write)混合到计算中。如果您不理解递归,只需使用循环:

var total = 0;
for (var i=1; i<=n; i++)
    total += formula(i);
return total; // the result

同样的事情,用递归完成:

function sumFormulaUpTo (n) {
    if (n <= 0) // the abort condition
        return 0;
    else
        return sumFormulaUpTo(n-1) + formula(n);
}
sumFormulaUpTo(100);

您注意到:没有total变量,只使用了递归调用函数的结果。

使用结束递归(更像是循环),它看起来像这样:

function sumFormulaFromTo(total, i, n) {
    if ( i > n )
        return total;
    else {
        var newtotal = total + formula(i);
        return sumFormulaFromTo(newtotal, i+1, n);
    }
}
sumFormulaFromTo(0, 1, 100);

如果您在函数外部静态声明了totaln,那么它看起来更像是您的。然而,你忘了在满足结束条件后返回结果(你输出一些东西,但返回undefined),然后以某种方式调用了formula的结果的递归 - 不知道你在哪里得到来自。根据@cbayram,这会导致无限循环。