Упростить код
Подскажите, как можно упростить базовый случай?
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, время: 16:36. |