Определите, сколько раз заданный элемент входит в список

      Комментарии к записи Определите, сколько раз заданный элемент входит в список отключены

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

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

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

    questioner
    Участник

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

    Определить число вхождений заданного элемента в список.

  • #1946

    Решить задачу можно при помощи стандартного предиката findall:

    count(List, Element, Count):-
      findall(Element, member(Element, List), Counters),
      length(Counters, Count).

    Функция findall вторым аргументом принимает цель, которую пытается выполнить и найти все решения. Каждый раз, когда находится решение цели, значение, указанное в первом аргументе findall помещается в список, заданный третьим аргументом.
    В приведенном примере каждый раз, когда выполнится цель member(Element, List), значение элемента будет добавлено в список. Поэтому результирующий список Counters будет содержать число вхождений. Определить количество элементов списка можно предикатом length, который точно также, как member, является стандартным.

    Задачу можно решить и без использования findall:

    count([], _Element, 0):-!.
    count([Element|Tail], Element, Count):-
      !, count(Tail, Element, CountTail), 
      Count is CountTail + 1.
    count([_Element|Tail], Element, Count):-
      count(Tail, Element, Count).

    Задача решается рекурсивно. Исходный список разделяется на первый элемент и список остальных элементов (Tail).
    Количество вхождений элемента в список зависит от значения первого элемента (если оно равно искомому значению – нужно прибавить единицу к результату) и количества вхождений элемента в Tail.

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