Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Упростить код (https://javascript.ru/forum/misc/85810-uprostit-kod.html)

firep91613 22.03.2024 18:54

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

Нужно сделать рекурсивную функцию, которая находила бы второе минимальное число в массиве. Я сделал, но что-то мне это решение кажется идиотским...

voraa 22.03.2024 22:06

Обязательно рекурсивную?
Без рекурсии, вроде так
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]));

voraa 22.03.2024 22:11

Или уж совсем не эффективно, но просто (для новых браузеров)

function secondMin (arr) {
   return arr.toSorted()[1];
}

firep91613 23.03.2024 13:00

voraa,
благодарю. Но нужна рекурсия.

Gvozd 23.03.2024 16:29

Первое условие содержит в себе дубликат логики из остального тела
Можно упростить до
if (arr.length == 0) {
  return min2;
}


Во втором блоке можно убрать else, ведь каждая ветка заканчивается return-ом

Alexandroppolus 23.03.2024 17:29

у меня так получилось
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];

Aetae 24.03.2024 02:01

Зачем рекурсивно то? Это делается в один проход...

voraa 24.03.2024 09:12

Цитата:

Сообщение от Aetae
Зачем рекурсивно то?

Есть предположение, что это учебное задание на каких-нибудь тупых курсах.
На нормальных курсах для изучения рекурсии дали бы задание, где она действительно нужна.

firep91613 24.03.2024 09:29

Gvozd,
благодарю. Намного лучше стало.

Alexandroppolus,
спасибо. Интересное решение.

voraa,
да не, просто случайно наткнулся.

firep91613 24.03.2024 09:37

Цитата:

Сообщение от voraa
Есть предположение, что это учебное задание на каких-нибудь тупых курсах.

На главной странице ютуба появилось видео - https://www.youtube.com/watch?v=j6OMmKyKduE
В описании к видео есть задачи. Вот и все.


Часовой пояс GMT +3, время: 10:43.