2012-05-31 6 views
1

Итак, у меня есть эта программа, которая запрашивает минимальное значение в массиве, и я написал код, но, похоже, я пропустил цикл. Я буду писать правильный код, но я надеюсь, что кто-нибудь объяснить, почему существует цикл в то время какМинимальное значение в массиве

<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 

Я нахожу это действительно трудно понять эту петлю, и если я может спросить: есть ли другой способ найти минимальное значение в массиве? Большое спасибо!

ответ

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

Это быстрее, потому что в отличие от — исходного кода — это не перебирать первых, не четных значений дважды. Это будет примерно эквивалентно скорости, если for цикл в оригинале начал с индексом y, т.е. for (var i=y+1;i<number.length;++i)

Это также очень немного быстрее, поскольку цикл for кэширует длину массива, вместо того, чтобы смотреть его каждый раз, и потому что он только ищет значение в массиве после каждого цикла, а не три раза. Современные JavaScript-процессы, такие как V8, могут оптимизировать наивный код, чтобы вести себя аналогичным образом, поэтому это не очень важный момент.


Редактировать: Для развлечения, здесь современный, функциональный подход к программированию:

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

выше использует Array.filter, чтобы создать новый массив только четными ценных предметов, а затем использует Function.prototype.apply передать массив значений в качестве параметров на Math.min.

+0

@aablah Поскольку вы спросили о «другом способе найти минимальные» Я отредактировал мой ответ, чтобы добавить альтернатива циклу по всем значениям. Если вы считаете, что это решило ваш вопрос, вы должны [принять этот ответ] (http://meta.stackexchange.com/a/5235/153741). – Phrogz

0

Если вы заинтересованы, как сделать это в современной Javascript, это выглядит следующим образом:

minEvenElement = Math.min.apply(Math, myArray.filter(function(e) { return !(e % 2) })) 
Смежные вопросы