Список элементов, встречающихся более одного раза

      Комментарии к записи Список элементов, встречающихся более одного раза отключены

Главная Форумы Программирование Помощь с решением задач на Prolog Задачи на списки Список элементов, встречающихся более одного раза

В этой теме 1 ответ, 2 участника, последнее обновление  Васильев Владимир Сергеевич 1 год, 7 мес. назад.

  • Автор
    Сообщения
  • #2494

    questioner
    Участник

    Помогите решить задачу на Visual Prolog:

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

  • #2496

    Функция, выполняющая поставленную задачу должна принимать на вход два списка — исходный и результирующий. Однако, в задаче удобно использовать метод накапливающего параметра, т.е. до наступления определенных условий накапливать результат в дополнительном аргументе функции, а затем — переписать этот буфер в результирующий список. Для этого функции необходимо использовать дополнительный аргумент, изначально инициализированный пустым списком:

    repeated_set(List, Result):-
      repeated_set(List, [], Result).

    Функция, использующая накапливающий параметр должна:

    • возвращать накопленный результат если исходный список пуст;
    • добавлять первый элемент к накопителю во время рекурсивного вызова если он отсутствует в хвосте списка (не повторяется в остальной части списка) и отсутствует в накопителе (не был ранее обработан как повторяющийся);
    • пропустить первый элемент, а остальные обработать рекурсивно если ни одной другое условие не выполнилось (элемент не является повторяющимся).

    Поиск первого элемента списка среди списка накапливающего параметра в этом случае выполняется для того, чтобы элементы в результирующем списке не дублировалось (такое было бы возможно при нескольких повторах одного и того же элемента в исходном списке). Для поиска элемента в списке может использоваться функция member.

    repeated_set([], BufferResult, BufferResult):-!.
    repeated_set([Head|Tail], BufferResult, Result):-
      member(Head, Tail),
      NOT(member(Head, BufferResult)), !,
      repeated_set(Tail, [Head|BufferResult], Result).
    repeated_set([_Head|Tail], BufferResult, Result):-
      repeated_set(Tail, BufferResult, Result).

    Вложения:

Для ответа в этой теме необходимо авторизоваться.