0

配列の長さが 100 であるかどうかを確認する次の再帰関数がありますoutput。長さが 100 未満の場合、関数が再帰的に呼び出され、次のように引数変数 n が 1 ずつ増加します。

var eratosthenes = function(n) {
    // Eratosthenes algorithm to find all primes under n
    var array = new Array(), upperLimit = Math.sqrt(n), output = new Array();

    // Make an array from 2 to (n - 1)
    for (var i = 0; i < n; i++) {
        array.push(true);
    }

    // Remove multiples of primes starting from 2, 3, 5,...
    for (var i = 2; i <= upperLimit; i++) {
        if (array[i]) {
            for (var j = i * i; j < n; j += i) {
                array[j] = false;
            }
        }
    }

    // All array[i] set to true are primes
    for (var i = 2; i < n; i++) {
        if(array[i]) {
            output.push(i);
        }
    }
    if (output.length < 100){
        eratosthenes(n+1);
    } else {
        return output;
    }
};

正しい長さの配列が計算されたらoutput、次の関数を使用して配列をフォーマットします。

var fmt = function(arr){
    return arr.join();
}

しかし、eratosthenes 関数を次eratosthenes(100)のように呼び出すと、返された配列によってfmt関数で例外が発生します。ただし、eratosthenes 関数が次のように呼び出される場合:eratosthenes(545)配列outputの長さ = 100 の場合、配列はfmt問題なく関数に渡すことができます。この問題を再帰で解決する方法はありますか?

4

1 に答える 1

5

関数呼び出しの結果を返す必要があります。

return eratosthenes(n+1);
于 2013-06-26T10:03:47.843 に答える