Tishaa
@Tishaa

Какая логика у перебора массива таким способом?

есть массив, функия ищет минимальное число и выдаёт его нажав на кнопку, у меня вопрос такой
for перебирает весь массив но каким образом, вот хочу понять последовательность
в данном примере
let min = 12 по факту у нас условие если arr[i] меньше 12 то let min перезаписывается НО, i у нас начинается с 0, так почему он перезаписывает на 3 а не на 0, 1 или 2, они же тоже меньше 12, не понимаю, обьясните

let mas = [12, 5, 8, 20, 3, 16];
function getMin(arr){
    let min = arr[0];
    for (i=0;i < arr.length;i++){
        if(arr[i] < min){
            min = arr[i];
        }
    }
    return min;
}

minBtn.onclick = function (){
    let min = getMin(mas);
    sMin.textContent = min;
}
  • Вопрос задан
  • 128 просмотров
Решения вопроса 2
sergiks
@sergiks Куратор тега JavaScript
♬♬
i — это индекс массива — номер позиции в нём, считая от 0.
arr[i]значение, которое лежит в массиве arr в позиции i.
ещё проще
Массив представьте как ряд одинаковых коробочек, юпронумерованных от 0 до N.
В коробочках что-то лежит. Обратиться к коробку можно по имени массива и номеру ячейки: arr[4] например – это пятая по счету коробка, т.к. счет идёт от 0.


Последовательность получается примерно такая:
min = 12;

i = 0; arr[i] = 12; arr[i] меньше min? НЕТ. идём дальше
i = i + 1
i = 1; arr[i] = 5; arr[i] меньше min? ДА. min становится 5; идём дальше
i = i + 1
i = 2; arr[i] = 8; arr[i] меньше min? НЕТ. идём дальше
i = i + 1
...
i = 4; arr[i] = 3; arr[i] меньше min? ДА. min становится 3; идём дальше
...
for закончил работу, min так и остался равным 3
Ответ написан
Комментировать
iiiBird
@iiiBird
Пока ты спишь - твой конкурент совершенствуется
i у нас 0. но сравнивается то arr[i], т.е arr[0]

на 1 итерации будет 12 < 12 => false
на 2 итерации будет 5 < 12 => true => min = 5
на 3 итерации будет 8 < 5 => false
на 4 итерации будет 20 < 5 => false
на 5 итерации будет 3 < 5 => true => min = 3
т.е. на 6 итерации будет 16 < 3 => false
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
IvanU7n
@IvanU7n
nothing interesting here
а кто сказал что не перезаписывается?
в крайнем случае console.log() в помощь, если отладкой через DevTools воспользоваться не получается

и ещё, при таком алгоритме обычно начинают итерацию с 1 элемента, пропуская 0, тибо он уже в min

673e4adf28dd7544527151.png
Ответ написан
Комментировать
VoidVolker
@VoidVolker Куратор тега JavaScript
Dark side eye. А у нас печеньки! А у вас?
Во-первых, вы путаете индекс массива и значение по этому индексу. Индекс - номер значения в массиве, а сравнение происходит только значений.
Кроме того, логика тут следующая: нам надо пройтись по всему массиву и найти минимальное значение, а функция вычисления минимального значения требует два аргумента. С чем и как сравнивать первый элемент массива, ведь он только первый? Это можно сделать только со вторым элементом и так до самого конца, ведь последний элемент массива будет сравниваться с минимальным элементом из предыдущих итераций. Добавлять дополнительную проверку в тело цикла - добавлять эту же проверку для всех итераций, а первый элемент в списке только один. Поэтому логично для первой итерации подготовить первый элемент списка для сравнения до начала цикла, а итерацию прохода по списку начинать со второго элемента. В приведённом данном коде как раз тут ошибка: цикл начат с первого элемента и происходит сравнение первого элемента с самим собой на первой итерации, а уже только потом идёт реальная работа. Правильнее будет следующее решение:
function getMin(arr){
    if (arr.length == 0) { return Number.POSITIVE_INFINITY } // Делаем как в Math.min()
    let min = arr[0];
    for (i=1;i < arr.length;i++){
        if(arr[i] < min){
            min = arr[i];
        }
    }
    return min;
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
21 нояб. 2024, в 13:18
2000 руб./за проект
21 нояб. 2024, в 13:16
1500 руб./за проект
21 нояб. 2024, в 13:15
2500 руб./за проект