1

そのため、配列内の偶数の最小値を要求するこのプログラムがあり、コードを記述しましたが、ループを逃したようです。私は正しいコードを書きますが、whileループがある理由を誰かが説明してくれることを願っています

    <HTML>
    <HEAD>
    <SCRIPT LANGUAGE = "JavaScript">

    var number=new Array(10)

  for(var i=0; i<number.length; i=i+1)
{ 
   number[i] =window.prompt('enter number ','')
   number[i] =parseFloat(number[i])
}

  var y = 0 
  while (number[y] % 2 != 0) //get the first even number in the array
{
    y = y + 1
}
//after you exit the while loop y will have the index of the first even number 

var Min 
Min = number[y] 

 for(var i=0; i<number.length; i=i+1)
{
    if (number[i] % 2 == 0)
    {
            if(number[i]<Min)
            {
                    Min= number[i]
            }
    }
}

document.write(Min)

</SCRIPT>
</HEAD>
</HTML>

というわけで、この部分

  var y = 0 
  while (number[y] % 2 != 0) //get the first even number in the array
{
    y = y + 1
}
//after you exit the while loop y will have the index of the first even number 

このループを実際に把握するのは難しいと感じています。配列内の最小値を見つける別の方法はありますか? どうもありがとう!

4

2 に答える 2

3

while ループは、Min後続の比較が機能するように の最初の値を設定します。同じことを行うためのはるかに簡単で高速な方法を次に示します。

var min = Infinity; // Start with the biggest number possible
for (var i=myArray.length;i--;){
  var val = myArray[i];
  if (val<min && val%2==0) min = val;
}

これは、元のコードとは異なり、最初の偶数でない値を 2 回反復しないため、高速です。for元のループが indexyで始まった場合、速度はほぼ同等です。for (var i=y+1;i<number.length;++i)

forまた、ループは配列の長さを毎回検索するのではなくキャッシュするため、またループごとに 3 回ではなく 1 回だけ配列内の値を検索するため、わずかに高速です。V8 のような最新の JavaScript ランタイムは、単純なコードを最適化して同様に動作させることができるため、これはあまり重要なポイントではありません。


編集:楽しみのために、ここに最新の関数型プログラミングアプローチがあります:

var min = Math.min.apply(Math,myArray.filter(function(n){ return n%2==0 }));

上記は、 を使用Array.filterして偶数の値の項目のみの新しい配列を作成し、 を使用Function.prototype.applyして値の配列をパラメータとして に渡しますMath.min

于 2012-05-31T20:28:23.163 に答える
0

最新の Javascript でそれを行う方法に興味がある場合は、次のようになります。

minEvenElement = Math.min.apply(Math, myArray.filter(function(e) { return !(e % 2) }))
于 2012-05-31T21:07:07.317 に答える