Разделение списка на подсписки: в первый 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))