Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 22.03.2024, 18:54
Аспирант
Отправить личное сообщение для firep91613 Посмотреть профиль Найти все сообщения от firep91613
 
Регистрация: 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]));

Нужно сделать рекурсивную функцию, которая находила бы второе минимальное число в массиве. Я сделал, но что-то мне это решение кажется идиотским...
Ответить с цитированием
  #2 (permalink)  
Старый 22.03.2024, 22:06
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 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]));
Ответить с цитированием
  #3 (permalink)  
Старый 22.03.2024, 22:11
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,750

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

function secondMin (arr) {
   return arr.toSorted()[1];
}
Ответить с цитированием
  #4 (permalink)  
Старый 23.03.2024, 13:00
Аспирант
Отправить личное сообщение для firep91613 Посмотреть профиль Найти все сообщения от firep91613
 
Регистрация: 24.10.2023
Сообщений: 58

voraa,
благодарю. Но нужна рекурсия.
Ответить с цитированием
  #5 (permalink)  
Старый 23.03.2024, 16:29
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

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


Во втором блоке можно убрать else, ведь каждая ветка заканчивается return-ом
Ответить с цитированием
  #6 (permalink)  
Старый 23.03.2024, 17:29
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 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];
Ответить с цитированием
  #7 (permalink)  
Старый 24.03.2024, 02:01
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,588

Зачем рекурсивно то? Это делается в один проход...
__________________
29375, 35
Ответить с цитированием
  #8 (permalink)  
Старый 24.03.2024, 09:12
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,750

Сообщение от Aetae
Зачем рекурсивно то?
Есть предположение, что это учебное задание на каких-нибудь тупых курсах.
На нормальных курсах для изучения рекурсии дали бы задание, где она действительно нужна.
Ответить с цитированием
  #9 (permalink)  
Старый 24.03.2024, 09:29
Аспирант
Отправить личное сообщение для firep91613 Посмотреть профиль Найти все сообщения от firep91613
 
Регистрация: 24.10.2023
Сообщений: 58

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

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

voraa,
да не, просто случайно наткнулся.
Ответить с цитированием
  #10 (permalink)  
Старый 24.03.2024, 09:37
Аспирант
Отправить личное сообщение для firep91613 Посмотреть профиль Найти все сообщения от firep91613
 
Регистрация: 24.10.2023
Сообщений: 58

Сообщение от voraa
Есть предположение, что это учебное задание на каких-нибудь тупых курсах.
На главной странице ютуба появилось видео - https://www.youtube.com/watch?v=j6OMmKyKduE
В описании к видео есть задачи. Вот и все.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите упростить код открывания панелей Anrew Общие вопросы Javascript 18 14.11.2015 22:15
Создать код CSS+HTML JamesMorgan Общие вопросы Javascript 2 11.08.2015 12:50
Код ответа сервера и обновление iframe alexdemi911 Общие вопросы Javascript 6 10.08.2015 22:30
Помогите к js коду, написать html код Modrih Элементы интерфейса 8 16.06.2015 18:08
Требуется выводить код рекламного блока Adsense из файла JavaScript??? speedflow Элементы интерфейса 0 26.05.2012 15:50