Элементы с нечетными индексами двух списков

      Комментарии к записи Элементы с нечетными индексами двух списков отключены

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

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

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

    questioner
    Участник

    Здравствуйте, помогите исправить ошибку в коде.
    Программа складывает 2 списка в третий таким образом что сначала идут элементы с нечетными номерами из 1-го списка а потом из 2-го.
    Ошибка в том, что если количество элементов в списке нечетное, то последний нужный символ не выводится. Как это можно исправить?
    Выполнено на Prolog 5.2:

    domains 
      element=integer 
      list=element* 
    predicates 
      nondeterm odd_indexes_append(list,list,list) 
    clauses 
      odd_indexes_append([],[],[]):-!. 
      odd_indexes_append([],[_],[]):-!. 
      odd_indexes_append([SingleElement],List2,[SingleElement|Tail]):-
        odd_indexes_append([],List2,Tail). 
      odd_indexes_append([],[Head2,_|Tail2],[Head2|Tail3]):-
        odd_indexes_append([],Tail2,Tail3). 
      odd_indexes_append([Head1,_|Tail1],List2,[Head1|Tail3]):-
        odd_indexes_append(Tail1,List2,Tail3). 
    goal 
      odd_indexes_append([2,-6,-9,3,10,43,38],[3,6,8,12,5],L).

  • #2493

    У вас реализован следующий алгоритм:

    1. из первого списка выбираются пары элементов, при этом второй элемент игнорируется, а первый добавляется к результату, полученному при рекурсивной обработке хвоста первого списка;
    2. если пару элементов выбрать нельзя, но первый список состоит из единственного элемента — этот элемент дописывается в результат, полученный при обработке пустого списка в качестве первого аргумента;
    3. если первый список пуст — то аналогичным образом обрабатывается второй список;
    4. если оба списка пусты — результат работы эквивалентен пустому списку.

    Что касается ошибки — у вас последний элемент второго списка игнорируется, но ведь вы сами написали такое поведение во втором правиле:
    odd_indexes_append([],[_],[]):-!.
    Нужно понимать так, что если первый список пуст, а второй состоит из одного элемента — верни пустой список. Замените этот фрагмент на следующий чтобы программа заработала:
    odd_indexes_append([],[SingleElement],[SingleElement]):-!.

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

    При этом для выделения элементов с нечетными индексами можно использовать готовую функцию split, которая более чем тривиальна, а для соединения результатов — встроенную во многие диалекты пролога — функцию append:

    odd_indexes_append(A, B, Appended):-
      split(A, OddA, _EvenA),
      split(B, OddB, _EvenB),
      append(OddA, OddB, Appended).

    Разве не проще? 🙂

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