Извлечь из списка четные и нечетные элементы

      Комментарии к записи Извлечь из списка четные и нечетные элементы отключены

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

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

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

    questioner
    Участник

    Здравствуйте! Подскажите пожалуйста, каким образом нужно задать условие к списку L2, чтобы из него извлекались только элементы с четным индексом? Изначальное условие задачи таково:

    l1,l2 — списки, элементами которых являются атомы. Построить список l3, нечетные элементы которого содержат соответствующие нечетные элементы списка l1, а четные — четные из l2. Вот код:

    domains
      i=integer
      il=i*
     
    predicates
      nondeterm append(il,il,il)
     
    clauses
     
      append([],[],[]).
      append([],[_],[]).
      append([A],L2,[A|T]):-append([],L2,T).
      append([H1,_|T1],L2,[H1|T3]):-append(L2,T1,T3).

    Пример:

    элементы списка l1: 3,7,2,9,0
    элементы списка l2: 12,5,6,4,7,13
    Список l3 должен содержать следующие элементы: 3, 5, 2, 4, 0, 13

  • #1732

    selectOdd(0, [Head|_], [], [Head]):-!.
    selectOdd(1, [], [Head,_], [Head]):-!.
    selectOdd(_, [], _, []):-!.
    selectOdd(_, _, [], []):-!.
    selectOdd(0, [Head|Tail1], [_|Tail2], [Head|ResulTail]):-
        selectOdd(1, Tail1, Tail2, ResulTail), !.
    selectOdd(1, [_|Tail1], [Head2|Tail2], [Head2|ResulTail]):-
        selectOdd(0, T1, Tail2, ResulTail),!.

    Если первый аргумент равен нулю — в результирующий список берется элемент из первого списка, если 1 — то из второго.
    Суть в том, что пока списки не кончатся, надо выбирать элементы из них (выбираются элементы в любом случае из обоих списков), элемент одного списка прикреплять к результату, а второго — пропускать. Делается это пока оба списка не кончатся. Вроде бы просто. но есть артефакт — если списки разной длины, и, скажем, нечетный список больше чем четный — то из него надо взять на 1 элемент больше.

    По строкам:
    1. Если в первом списке один элемент и мы хотим выбирать с него {ноль в первом аргументе} — результат — список из элемента первого списка;
    3. Если первый список пуст — результат — пустой список;
    5. Если выбираем с первого списка — то первый список разделяем на голову (Head), хвост(Tail1), первый элемент второго списка игнорируем, а то, что от него осталось помещаем в Tail2, рекурсивно обрабатываем Tail1 и Tail2, но при этом вызываем функцию с единицей в первом аргументе (чтобы выбрать элемент из второго списка). Результат рекурсивного вызова поместится в ResulTail, к нему приделаем первый элемент первого списка и вернем как общий результат.

    С остальными строками аналогично, но для второго списка.

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