Добавление в начало списка, но не в конец - Prolog
Формулировка задачи:
Дан список L1, число N. Cформировать из L1 список списков LL, содержащий в себе списки, размерa N.
Пример:
L1 = [1,2,3,4,5,6,7,8,]
N = 3
LL = [[1,2,3], [4,5,6], [7,8]].
Накидал такого рода вещь
Здесь в качестве второго параметра выступает вспомогательный список, который и формирует списки нашего списка списков. Как видите, перед каждым добавлением списка L2 в LL мне приходится реверсировать L2. Можно ли как-то избежать этого? Когда пытаюсь добавлять элемент из L1 в L2 в левой части правила, появляется сообщение:
"PROGRAM ERROR. Module: Pos:0
Message:1001 Gstack overflow. Not enough memory or an endless loop".
Решение задачи: «Добавление в начало списка, но не в конец»
textual
Листинг программы
cut([], _, [], []) :- !. cut(L, 0, [], L) :- !. cut([H|T1], N, [H|T2], L) :- NN is N - 1, cut(T1, NN, T2, L). f1([], _, []) :- !. f1(L, N, [L1|T]) :- cut(L, N, L1, L2), f1(L2, N, T).
Объяснение кода листинга программы
cut([], _, [], []) :- !.
: Эта строка кода является базовым случаем для пустого списка. Если список пуст, то ничего не происходит.cut(L, 0, [], L) :- !.
: Эта строка кода также является базовым случаем, но уже для списка, содержащего только один элемент. В этом случае этот элемент добавляется в начало нового списка, а сам список остается неизменным.cut([H|T1], N, [H|T2], L) :-
: Эта строка кода обрабатывает случай, когда список содержит более одного элемента. ЗдесьH
- это первый элемент списка, который мы хотим добавить в начало нового списка, аT1
- это оставшаяся часть исходного списка.NN is N - 1,
: Эта строка кода вычисляет новое значениеN
, которое используется для обработки следующего элемента в исходном списке.cut(T1, NN, T2, L).
: Эта строка кода рекурсивно вызывает функциюcut
для обработки оставшейся части списка.f1([], _, []) :- !.
: Эта строка кода является базовым случаем для пустого списка в функцииf1
. Если список пуст, то ничего не происходит.f1(L, N, [L1|T]) :-
: Эта строка кода обрабатывает случай, когда список содержит более одного элемента. ЗдесьL1
- это новый список, который формируется путем добавления первыхN
элементов исходного списка в начало.cut(L, N, L1, L2),
: Эта строка кода вызывает функциюcut
для формирования нового спискаL1
и оставшегося спискаL2
.f1(L2, N, T).
: Эта строка кода рекурсивно вызывает функциюf1
для обработки оставшегося спискаL2
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д