Разделение списка на подсписки: в первый n элементов с начала списка, во второй оставшиеся - Lisp
Формулировка задачи:
Определите функцию, осуществляющую разделение исходного списка на два
подсписка. В первый из них должно попасть указанное количество элементов
с начала списка, во второй — оставшиеся элементы.
Как проверить этот код?
(defun F (L M) (if L (if (zerop M) (cons nil (cons L nil)) ((lambda (elem result) (cons (cons elem (car result)) (cdr result))) (car L) (F (cdr L) (1- M))))))
Решение задачи: «Разделение списка на подсписки: в первый n элементов с начала списка, во второй оставшиеся»
textual
Листинг программы
(defun split (lst n) (let ((a nil) (b nil)) (iter (for x in lst) (for i upfrom 1) (if (<= i n) (collecting x into a) (collecting x into b))) (list a b))) ==> split (split '(a b c d e f g) 3) ==> ((a b c) (d e f g))
Объяснение кода листинга программы
В коде определён вспомогательный внутренний функциональный язык программирования Lisp с именем split
, который принимает два аргумента: lst
и n
. Аргумент lst
является списком, который необходимо разделить на подсписки, а аргумент n
— натуральное число, определяющее количество элементов в первом подсписке.
Функция split
использует встроенную функцию iter
, которая позволяет осуществить итерацию по элементам списка lst
. Внутри iter
два вложенных цикла:
- Внешний цикл
for x in lst
перебирает все элементы спискаlst
. - Внутренний цикл
for i upfrom 1
выполняет итерацию, сопровождающуюся проверкой условия: если значение переменнойi
меньше или равноn
, то элементx
собирается в первый подсписокa
, иначе он собирается во второй подсписокb
. В конце выполнения функцииsplit
возвращается список, состоящий из двух подсписков:a
иb
. Пример использования функцииsplit
: (split '(a b c d e f g) 3) Выполнение кода приводит к следующему результату: ((a b c) (d e f g))
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д