Prolog — Удалить из списка четные значения

Помечено: , ,

Просмотр 1 ветки ответов
  • Автор
    Сообщения
    • #6807
      @nodeli
      StudLance.ru

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

      У меня есть программа, которая считает Количество таких значений

      even([],0).
      even([A|List],Number):- 
        A mod 2 =:= 0, !,
        even(List,Number1), 
        Number is Number1 + 1.
      even([_|List],Number):- 
       !, even(List,Number).

      Какие строчки нужно добавить, чтобы четное значение удалялось из списка?

      StudLance.ru

    • #6808
      @admin

      Здравствуйте. Как работает ваша программа?
      1. Если список пуст — верни ноль (ведь в пустом списке нет четных элементов)
      2. Иначе — извлеки из списка первый элемент (назовем его А, а остальные элементы — List)
      3. Если этот элемент четный (A mod 2 =:= 0) тогда обработай остальные рекурсивно, а к полученному результату (назовем его Number1) прибавь единицу — получишь ответ.
      4. Иначе (если элемент А нечетный) — обработай рекурсивно остальные элементы и что получится в результате — то и верни в качестве ответа.

      Как изменить вашу программу?
      1. Очевидно, если список пуст — то вернуть надо пустой список
      2. Если первый элемент четный — то остальные обрабатывает рекурсивно и ответом назовем то, что вернет функция (вызванная рекурсивно). Ведь четный элемент к списку добавлять не нужно.
      3. Ну а в противном случае — добавим элемент к списку.

      Тоже самое на SWI Prolog:

      remove_even([], []).
      remove_even([A|List], Result):- 
          A mod 2 =:= 0, !,
          remove_even(List, Result).
      remove_even([Head|Tail], [Head|TailResult]):- 
          remove_even(Tail, TailResult).

      Тестировал так:

      • #6833
        @nodeli

        Огромное спасибо вам за развёрнутый ответ! Очень помогли

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