0

数値の素因数分解を見つける Web ページを作成しています。私が使用する関数は、ループ内からそれ自体を呼び出します。関数内で関数を実行した後、ループのインデックスは、2 回目の呼び出しで到達したインデックスから変更されます。配列内のすべての素因数を返す必要があります。これがコードです。

function pf(num){
    max=Math.floor(Math.sqrt(number));
    factors=[];
    prime=true;
    for(count=2;count<=max;count++){
        ratio=num/count;
        if(ratio%1==0){
            alert(count);//HERE
            factors=pf(ratio);
            alert(count);//HERE
            factors.push(count);
            prime=false;
            break;
        }
    }
    if(prime){
        factors.push(num);
    }
    return factors;
}

このコードが 20 の入力で実行されるとします。最初のアラートでは数値 2 が表示されますが、次のアラートでは 3 が表示されます。関数の 2 回目の呼び出しによってループの現在のインデックスが変更されないようにする方法はありますか?

4

2 に答える 2

3

var特にグローバルにしたい場合を除き、すべての変数に 使用する必要があります。var変数を実行中のコンテキスト (この場合は function ) に対してローカルにしますpf。それがなければ、すべての変数はグローバルであり、windowこれをブラウザーで実行している場合はおそらくコンテキストに依存します。

maxand/orcountがグローバルで あるために問題が発生していると思われます。

行う

var max = Math.floor(Math.sqrt(number));

for(var count=2;count<=max;count++){

于 2012-12-21T16:58:34.603 に答える
1

関数内の変数はすべて、いわゆるグローバル変数です。これは、スクリプトのどこからでも変更できる (そして変更される) ことを意味します。また、関数が終了した後も値を保持します。したがって、関数呼び出しごとに異なる初期値があります。

変数を関数内に保持するには、変数をローカルとして定義する必要があります。varこれは、変数を初めて定義するときにキーワードを使用して実行できます。

書くだけ

function pf ( num ) {
    var max = ...
    var factors = ...

等々。

これはより適切でクリーンな方法であり、そのようなバグを回避するのに役立ちます。

于 2012-12-21T17:02:24.163 に答える