Заменить подряд идущие одинаковые элементы одним

      Комментарии к записи Заменить подряд идущие одинаковые элементы одним отключены

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

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

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

    Решим задачу на языке программирования Prolog:

    Заменить в исходном списке подряд идущие одинаковые элементы одним.

    domains 
    	list = integer*
    predicates
      	pack_list(list, list)  	
    clauses
      	pack_list([], []):-!.
      	pack_list([Head], [Head]):-!.
      	pack_list([Head, Head|Tail], Packed):-
      		!, pack_list([Head|Tail], Packed).
      	pack_list([Head|Tail], [Head|PackedTail]):-
      		pack_list(Tail, PackedTail).
    goal
      	pack_list([1,2,2,3,3,3,4,4,1,1,2,5,5,6], X).

    pack_list

    Для пустого списка и списка из одного элемента решение элементарно (может быть получено без рекурсивных вызовов). Иначе, пробуем отделить от начала списка два одинаковых элемента — если получилось, то первый элемент надо удалить, а все остальное ([Head|Tail]) обработать рекурсивно. Если же первые два элемента списка различны — разделяем список на голову (Head) и хвост, хвост обрабатываем рекурсивно, а к полученному результату дописываем Head.

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