22.03.2024, 18:54
|
Аспирант
|
|
Регистрация: 24.10.2023
Сообщений: 58
|
|
Упростить код
Подскажите, как можно упростить базовый случай?
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]));
Нужно сделать рекурсивную функцию, которая находила бы второе минимальное число в массиве. Я сделал, но что-то мне это решение кажется идиотским...
|
|
22.03.2024, 22:06
|
|
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,750
|
|
Обязательно рекурсивную?
Без рекурсии, вроде так
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]));
|
|
22.03.2024, 22:11
|
|
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,750
|
|
Или уж совсем не эффективно, но просто (для новых браузеров)
function secondMin (arr) {
return arr.toSorted()[1];
}
|
|
23.03.2024, 13:00
|
Аспирант
|
|
Регистрация: 24.10.2023
Сообщений: 58
|
|
voraa,
благодарю. Но нужна рекурсия.
|
|
23.03.2024, 16:29
|
|
Матрос
|
|
Регистрация: 04.04.2008
Сообщений: 6,246
|
|
Первое условие содержит в себе дубликат логики из остального тела
Можно упростить до
if (arr.length == 0) {
return min2;
}
Во втором блоке можно убрать else, ведь каждая ветка заканчивается return-ом
|
|
23.03.2024, 17:29
|
|
Профессор
|
|
Регистрация: 25.10.2016
Сообщений: 1,012
|
|
у меня так получилось
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];
|
|
24.03.2024, 02:01
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,588
|
|
Зачем рекурсивно то? Это делается в один проход...
__________________
29375, 35
|
|
24.03.2024, 09:12
|
|
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,750
|
|
Сообщение от Aetae
|
Зачем рекурсивно то?
|
Есть предположение, что это учебное задание на каких-нибудь тупых курсах.
На нормальных курсах для изучения рекурсии дали бы задание, где она действительно нужна.
|
|
24.03.2024, 09:29
|
Аспирант
|
|
Регистрация: 24.10.2023
Сообщений: 58
|
|
Gvozd,
благодарю. Намного лучше стало.
Alexandroppolus,
спасибо. Интересное решение.
voraa,
да не, просто случайно наткнулся.
|
|
24.03.2024, 09:37
|
Аспирант
|
|
Регистрация: 24.10.2023
Сообщений: 58
|
|
Сообщение от voraa
|
Есть предположение, что это учебное задание на каких-нибудь тупых курсах.
|
На главной странице ютуба появилось видео - https://www.youtube.com/watch?v=j6OMmKyKduE
В описании к видео есть задачи. Вот и все.
|
|
|
|