Задача на рекурсию - Prolog

Узнай цену своей работы

Формулировка задачи:

Помогите пожалуйста. Есть задача: Дана последовательность a с элементами из множества {0,1}. Проводятся следующие действия. Если a имеет вид 1,0,1,… , то она укорачивается на первые три элемента. В противном случае начальный элемент последовательности переносится в её конец. Указанные действия повторяются до тех пор, пока имеется возможность укоротить текущую последовательность. Требуется составить рекурсивную программу, имитирующую эти действия и возвращающую по исходной последовательности a результирующую последовательность b или сообщение, что b - пустое множество. Есть готовое решение на C#, но на Prolog перевести не получается.

Решение задачи: «Задача на рекурсию»

textual
Листинг программы
cut_seq_main :-
    N = 50,
    S = [1, 0, 1],
    gen_seq(N, L),
    format('Входное множество: ~w~n', [L]),
    format('Фильтр: ~w~n', [S]),
    cut_seq(S, L, L1),
    format('Выходное множество: ~w~n', [L1]).
    
gen_seq(0, []).
gen_seq(N, [X | R]) :-
    N > 0,
    X is random(2),
    N1 is N - 1,
    gen_seq(N1, R).
 
cut_seq(Shape, Seq, SeqOut) :-
  cut_seq_once(Shape, Seq, Seq1),
  Seq \= Seq1,
  !,
  cut_seq(Shape, Seq1, SeqOut).
cut_seq(_, Seq, Seq) :-
  !.
 
cut_seq_once(_, [], []).
cut_seq_once(Shape, Seq, Rest) :-
    append(Shape, Tail, Seq),
    !,
    cut_seq_once(Shape, Tail, Rest).
cut_seq_once(Shape, [Head | Tail], [Head | Rest]) :-
    cut_seq_once(Shape, Tail, Rest).

Объяснение кода листинга программы

  1. В первой строке объявлены следующие переменные: N (количество элементов в исходном множестве), S (фильтр, последовательность 1,0,1), L (исходное множество), L1 (результат).
  2. Вторая строка говорит, что если N=0, то генерировать последовательность не нужно, а если N>0, то генерируется случайное число X и вычисляется N1=N-1, и рекурсивно вызывается gen_seq(N1, R).
  3. Третья строка говорит, что если N=0, то результат пустой список, иначе рекурсивно вызывается cut_seq(Shape, Seq, Seq1), где Seq1 - это результат предыдущего вызова, и если Seq не равно Seq1, то продолжается рекурсия, иначе рекурсия прекращается.
  4. Четвертая строка говорит, что если Shape=[] (пустое множество), то результат пустой список.
  5. Пятая строка говорит, что если Shape=[Head|Tail] (не пустое множество), то рекурсивно вызывается cut_seq_once(Shape, Tail, Rest), где Rest - это результат предыдущего вызова, и если Tail не пустое множество, то добавляется Head в начало Rest и рекурсивно вызывается cut_seq_once(Shape, Tail, Rest).
  6. Шестая строка говорит, что если Shape=[Head|Tail] (не пустое множество), то результат это список, в котором первым элементом является Head, а остальное - это результат предыдущего вызова.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.167 из 5