Добавление в начало списка, но не в конец - 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).

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

  1. cut([], _, [], []) :- !.: Эта строка кода является базовым случаем для пустого списка. Если список пуст, то ничего не происходит.
  2. cut(L, 0, [], L) :- !.: Эта строка кода также является базовым случаем, но уже для списка, содержащего только один элемент. В этом случае этот элемент добавляется в начало нового списка, а сам список остается неизменным.
  3. cut([H|T1], N, [H|T2], L) :-: Эта строка кода обрабатывает случай, когда список содержит более одного элемента. Здесь H - это первый элемент списка, который мы хотим добавить в начало нового списка, а T1 - это оставшаяся часть исходного списка.
  4. NN is N - 1,: Эта строка кода вычисляет новое значение N, которое используется для обработки следующего элемента в исходном списке.
  5. cut(T1, NN, T2, L).: Эта строка кода рекурсивно вызывает функцию cut для обработки оставшейся части списка.
  6. f1([], _, []) :- !.: Эта строка кода является базовым случаем для пустого списка в функции f1. Если список пуст, то ничего не происходит.
  7. f1(L, N, [L1|T]) :-: Эта строка кода обрабатывает случай, когда список содержит более одного элемента. Здесь L1 - это новый список, который формируется путем добавления первых N элементов исходного списка в начало.
  8. cut(L, N, L1, L2),: Эта строка кода вызывает функцию cut для формирования нового списка L1 и оставшегося списка L2.
  9. f1(L2, N, T).: Эта строка кода рекурсивно вызывает функцию f1 для обработки оставшегося списка L2.

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


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

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

15   голосов , оценка 3.933 из 5
Похожие ответы