1

ここで関数を見つけました。整数の配列を受け入れ、最大公約数を返します。時々それは無限ループに入り、ブラウザをクラッシュさせます。原因を見つけるためにデバッグしたいのですが、sで使用されている構文がわかりませんforfor(var i; i<max; i++)これらを通常のループにどのように書き直すことができますか?

mdc = function(o){
    if(!o.length)
        return 0;
    for(var r, a, i = o.length - 1, b = o[i]; i;)
        for(a = o[--i]; r = a % b; a = b, b = r);
    return b;
}; 
4

5 に答える 5

2

これは、forループからwhileループへの直訳です。

mdc = function(o){
    if(!o.length)
        return 0;
    var r;
    var a;
    var i = o.length - 1;
    var b = o[i];
    while (i) {
        a = o[--i];            
        while (r = a % b) {
            a = b;
            b = r;
        }
    }        
    return b;
}; 

これは、いくつかの愚かさを解き、変数の名前を変更する翻訳です。

mdc = function(o){
    if(!o.length)
        return 0;
    var cur_index = o.length - 1;
    var b = o[cur_index];
    while (cur_index) {
        cur_index -= 1;
        var a = o[cur_index];              

        var remainder = a % b;         
        while (remainder) {
            a = b;
            b = remainder;
            remainder = a % b;
        }
    }        
    return b;
}; 
于 2012-08-24T02:28:13.070 に答える
1

やってみます

var r, a, i = o.length - 1
var b = o[i];

while(i) {
  a = o[--i];
  while(r = a % b) {
   a = b;
   b = r;
 }
 return b;
}
于 2012-08-24T02:25:08.957 に答える
1

これは、あなたが見慣れているのと同じことをしますが、それの各部分にもっと多くのステップがあるだけです。3つの部分があります:

パート1:変数を初期化します。

パート2:forが反復を継続する必要があるかどうかを検証します

パート3:変数を増減します。

それを見ると、いくつかのコンマが表示されます。複数の変数または条件を宣言するために使用されます。以下のコードは、投稿したコードと同じですが、見慣れた方法で作成されています。

mdc = function(o){
if(!o.length)
    return 0;
    var r;
    var a;
    var i = o.length - 1;
    for(var b = o[i]; i;) {
        for(a = o[--i]; r = a % b;b = r) {
           a = b;
        }
        return b;
    }
}; 

2番目のforは、コマンドラインに相当する「;」で終了していることがわかります。これは、「returnb」ではなく「a=b」コマンドのみが含まれている理由です。

于 2012-08-24T02:26:33.793 に答える
1

forループの基本式は次のとおりです。

for(initial code; condition to check for; code to execute after loop)
{
    loop
}

そのコードの構文は好きではありません。すべての変数を上部で宣言するだけです。コードをデバッグすることが最大の関心事であるため、1行に1つのステートメントを作成するのがおそらく最善です。

mdc = function(o)
{
    if(!o.length)
        return 0;
    var r, a, b, i;
    i = o.length - 1;
    b = o[i];
    while(i)
    {
        a = o[i];
        i--;
        while(r = a % b)
        {
            a = b;
            b = r;
        }
    }
    return b;
};
于 2012-08-24T02:30:18.647 に答える
1

「問題は、どちらが大きいかに応じて(a、b)を交換する必要があることだと思います。(2番目のforループ)。ユークリッドの互除法はそれを行います。これはそうしていないようです。

数の配列のGCD:標準のユークリッドアルゴリズムを使用します。

最後から反復する場合:GCD(a、b)= K
ここで、GCD(K、next_element_in_array)を呼び出します。それはうまくいくはずです。

enter code here
  Written in Pseudo-code What he is trying to do is more understandable:  
   For(b =array[end];   )    
     { 
      For(a= array[end-1]; end >=0 ;end --)  
          {
          (i)Divide a/b
          (ii)Put the new 'reduced' divisor in 'b'.
         (iii)Put the reminder back in c 
          }     
         end --
      } 

           }
       }

したがって、ループの最後で、彼がシミュレートしようとしているのは、一連の数値のgcdの手除算計算です。これは高校のトリックです。

問題は、前述したように、より大きなスワッピング(a、b)にあります。

于 2012-08-24T02:31:42.790 に答える