Форум программистов, компьютерный форум, киберфорум
Prolog
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
1 / 1 / 0
Регистрация: 30.03.2013
Сообщений: 7

Поменять в списке максимальный и минимальный элемент местами

30.03.2013, 01:20. Показов 2482. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
1. Простая программа: поменять в списке максимальный и минимальный элемент местами. Для начала я их определила:
Prolog
1
2
3
4
max([X|Y,M]):- max1(Y,X,M).
max1([B|Y],X,M):- B>X, !, max1(Y,B,M).
max1([_|Y],X,M):- max1(Y,X,M).
max1([],M,M).
Тоже самое по минимальному, только с заменой знака.
Далее с заменой местами начался большой ступор. Написала что-то вроде:
Prolog
1
2
3
4
5
6
emax(M2,M3,[X|Y]):-
  X=M2,
  emax(M2,M3,[M3|Y]).
emax(M2,M3,[_|Y]):-
  emax(M2,M3,Y).
emax(_,_,[]).
Это только замена максимального элемента минимальным. Но 1) при возврате списка замена возвращается на своё место, 2) при замене минимального максимальным будут заменяться уже 2 значения минимального.
Объясните как это сделать, желательно наглядным примером( Буду очень благодарна!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.03.2013, 01:20
Ответы с готовыми решениями:

Поменять местами максимальный и минимальный элемент дерева
Помогите решить задачу "Поменять местами максимальный и минимальный элемент дерева"

Найти минимальный и максимальный элементы и их координаты, поменять местами минимальный и максимальный элемент
3) В матрице размером n на m (1<n, m<10) (ввод n, m и матрицы с клавиатуры) найти минимальный и максимальный элементы и их координаты,...

Поменять в списке местами первый минимальный и последний максимальный элементы
односвязный список stl (c++) На основе данных входного файла создать список. Поменять в списке местами первый минимальный и последний...

4
 Аватар для nullxdth
2304 / 1063 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
31.03.2013, 02:54
Собирайте список с обменом значений в один проход. Например, так:
Prolog
1
2
3
4
5
6
7
8
9
10
11
12
13
14
swap_values(_, _, [], []) :-
    !.
swap_values(A, B, [A | Tail], Result) :-
    swap_values(A, B, Tail, Result_),
    Result = [B | Result_],
    !.
swap_values(A, B, [B | Tail], Result) :-
    swap_values(A, B, Tail, Result_),
    Result = [A | Result_],
    !.
 
%% Example:
%% ?- swap_values(1,0, [1,0,1,0,1,0], Result).
%% Result = [0, 1, 0, 1, 0, 1].
Добавлено через 48 минут
Цитата Сообщение от AleksandraMT Посмотреть сообщение
Prolog
1
2
3
4
max([X|Y,M]):- max1(Y,X,M).
max1([B|Y],X,M):- B>X, !, max1(Y,B,M).
max1([_|Y],X,M):- max1(Y,X,M).
max1([],M,M).
Да. Не плохо У вас рекурсия хвостовая. Это хорошо.
Но я бы написал так:
Prolog
1
2
3
4
5
6
7
8
max([Init | Tail], Max) :-
    max(Tail, Init, Max).
 
max([], A, A) :-
    !.
max([Head | Tail], A, Max) :-
    A_ is max(Head, A),
    max(Tail, A_, Max).
Т.е. убрал бы лишнее предложение, где рекурсивный вызов с неизменным значением X. Ведь мы можем не только узнать, что одно значение больше другого, но и унифицировать переменную большим значением. Также совершенно не обязательно вводить max1. Prolog корректно сопоставит предикаты по количеству аргументов (кстати, у вас небольшая опечатка в предложении max).

Но в реальности лучше написать не рекурсивно, а через fold (reduce):
Prolog
1
2
3
4
5
6
7
8
9
max(A, B, Max) :-
    Max is max(A, B).
max_in_list([Init | Rest], Max) :-
    foldl(max, Rest, Init, Max).
 
min(A, B, Min) :-
    Min is min(A, B).
min_in_list([Init | Rest], Min) :-
    foldl(min, Rest, Init, Min).
А ещё я читал ваш код минут 5. Всему виной не говорящие имена переменных. Хотя это субъективно. Скорее всего я просто медленно соображаю.
1
1 / 1 / 0
Регистрация: 30.03.2013
Сообщений: 7
02.04.2013, 13:18  [ТС]
Спасибо за помощь! Вот именно обмен - это была главная загвоздка.
Красивый вариант кода, и более понятный) Осталось мне только реализовать)

Если что, я буду задавать вам вопросы по этой задаче в эту тему)
0
 Аватар для nullxdth
2304 / 1063 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
03.04.2013, 00:47
Цитата Сообщение от AleksandraMT Посмотреть сообщение
Спасибо за помощь! Вот именно обмен - это была главная загвоздка.
Красивый вариант кода, и более понятный) Осталось мне только реализовать)

Если что, я буду задавать вам вопросы по этой задаче в эту тему)
Конечно задавайте, не стесняйтесь! Очень рад помочь тем, кто хочет разобраться и понять.
0
1 / 1 / 0
Регистрация: 30.03.2013
Сообщений: 7
07.04.2013, 15:12  [ТС]
Задача решилась, но пришлось менять просто ВСЕ(
И обмен в один проход преподаватель сказал: неплохо, но не то. Все-таки замена должна проходить по индексам. В итоге посидела с вашими вариантами, вариантами на форуме, и вот что вышло:
Prolog
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
%trace
domains 
    i=integer 
    ii=i*
predicates
 change(i,i,ii,ii)
 maxi(ii,i,i)
 mini(ii,i,i)
clauses
 
change(1,2,[A,B|C],[B,A|C]):- !.
change(1,I,[A,B|C],[E,B|D]):- !,
 J=I-1,
 change(1,J,[A|C],[E|D]).
change(I,J,[A|B],[A|C]):-
    I1=I-1, 
    J1=J-1,
    change(I1,J1,B,C).
 
maxi([H|T],R,N):-
maxi(T,R,Nr),R>H,N=Nr+1,!.
maxi([H|_],H,1).
 
mini([H|T],R,N):-
mini(T,R,Nr),R<H,N=Nr+1,!.
mini([H|_],H,1).
 
goal
 clearwindow,
 S=[100,8,4,5,66,2,-7,-9],
 maxi(S,_,M1),
 mini(S,_,M2),
 change(M1,M2,S,S1),
 write("Spisok: ",S),
 write("\n\nResult: ",S1).
Но осталась маленькая проблема, которую преподаватель (фу-у-х) не заметил. Если 1 позицию поставить максимальный элемент, а на последнюю - минимальный, замена проходит. Если наоборот - то нет)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.04.2013, 15:12
Помогаю со студенческими работами здесь

Найти в односвязном списке минимальный и максимальный элементы и поменять их местами с помощью указателей
Нужно найти в односвязном списке минимальный и максимальный элемент и поменять их местами с помощью указателей(именно с помощью указателей)

В двумерном массиве поменять местами максимальный и минимальный элемент местами
Написать фрагмент программы для решения следующей задачи.В двумерном массиве поменять местами максимальный и минимальный элемент местами....

Поменять местами минимальный и максимальный элемент
Помогите сделать задачу, не понимаю как делать. Создать стек из случайных чисел и поменять местами минимальный и максимальный элементы....

Поменять местами минимальный и максимальный элемент
Здравствуйте, не могли бы Вы помощь решить следующие задачи: 1) найти номера строк элементы в каждой из которых одинаковы. 2)дана...

Поменять местами максимальный и минимальный элемент
помогите исправить ошибку...конечный массив неправильный получается uses crt; var i,n,k, max, min, imax, imin:integer; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 31.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 30.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru