Упростить код
Подскажите, как можно упростить базовый случай?
function secondMin(arr, min1 = Infinity, min2 = Infinity) { if (arr.length == 1) { /*if (arr[0] < min1) { min2 = min1; min1 = arr[0]; return min2 } if (arr[0] < min2) { min2 = arr[0]; return min2; } return min2;*/ switch (true) { case arr[0] < min1: min2 = min1; min1 = arr[0]; break; case arr[0] < min2: min2 = arr[0]; break; } return min2; } if (arr[0] < min1) { min2 = min1; min1 = arr[0]; return secondMin(arr.slice(1), min1, min2); } else if (arr[0] < min2 && arr[0] > min1) { min2 = arr[0]; return secondMin(arr.slice(1), min1, min2); } else { return secondMin(arr.slice(1), min1, min2); } } // [3, 1, 2]; // [1, 4, 2, 9, -1]; // [2, 1, 3, 4]; // [2, 1, 0, 3]; alert(secondMin([3, 1, 2])); Нужно сделать рекурсивную функцию, которая находила бы второе минимальное число в массиве. Я сделал, но что-то мне это решение кажется идиотским... |
Обязательно рекурсивную?
Без рекурсии, вроде так function secondMin (arr) { if (arr.length <= 1) return undefined; let [min1, min2] = (arr[0] < arr[1])? [arr[0], arr[1]] : [arr[1], arr[0]]; for (let i = 2; i < arr.length; i++) { if (arr[i] < min1) { min2 = min1; min1 = arr[i]; } else if (arr[i] < min2) { min2 = arr[i]; } } return min2; } console.log (secondMin([3, 1, 2])); console.log (secondMin([1, 4, 2, 9, -1])); console.log (secondMin([2, 1, 3, 4])); console.log (secondMin([2, 1, 0, 3])); |
Или уж совсем не эффективно, но просто (для новых браузеров)
function secondMin (arr) { return arr.toSorted()[1]; } |
voraa,
благодарю. Но нужна рекурсия. |
Первое условие содержит в себе дубликат логики из остального тела
Можно упростить до if (arr.length == 0) { return min2; } Во втором блоке можно убрать else, ведь каждая ветка заканчивается return-ом |
у меня так получилось
const secondMinRec = (arr, len) => { if (len < 2) { return [arr[0] ?? Infinity, Infinity]; } const rec = secondMinRec(arr, len - 1); const current = arr[len - 1]; if (current < rec[0]) { rec[1] = rec[0]; rec[0] = current; } else { rec[1] = Math.min(rec[1], current); } return rec; } const secondMin = (arr) => secondMinRec(arr, arr.length)[1]; |
Зачем рекурсивно то? Это делается в один проход...
|
Цитата:
На нормальных курсах для изучения рекурсии дали бы задание, где она действительно нужна. |
Gvozd,
благодарю. Намного лучше стало. Alexandroppolus, спасибо. Интересное решение. voraa, да не, просто случайно наткнулся. |
Цитата:
В описании к видео есть задачи. Вот и все. |
Часовой пояс GMT +3, время: 01:27. |