0

私の目的は、再帰を使用してシグマ表記を機能させることです。上限は 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>
4

1 に答える 1

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

total関数の外で静的に宣言した場合n、それはあなたのもののように見えます。それでも、終了条件が満たされたときに結果を返すのを忘れて (何かを出力しただけで return undefined)、どういうわけか再帰を呼び出して結果をformula- どこから得たのかわかりません。@cbayram によると、これにより無限ループが発生します。

于 2012-10-21T21:35:07.850 に答える