Разделить список на 2, в первый поместить четные элементы исходного списка, во второй - нечетные - Lisp
Формулировка задачи:
Решение задачи: «Разделить список на 2, в первый поместить четные элементы исходного списка, во второй - нечетные»
(defun task (lst) (let ((l-odd nil) (l-even nil)) (iter (for i in lst) (if (oddp i) (collecting i into l-odd) (collecting i into l-even))) (values l-odd l-even))) ==> task (task '(1 2 3 4 5 6 7)) ==> (1 3 5 7) (2 4 6) (defun task (lst &optional (l-odd nil) (l-even nil)) (cond ((null lst) (values (reverse l-odd) (reverse l-even))) ((oddp (car lst)) (task (cdr lst) (cons (car lst) l-odd) l-even)) (t (task (cdr lst) l-odd (cons (car lst) l-even))))) ==> task (task '(1 2 3 4 5 6 7)) ==> (1 3 5 7) (2 4 6)
Объяснение кода листинга программы
В первом представленном коде функцией task
разделяются список на два: нечетные и четные элементы. Для этого используется встроенная функция iter
, которая позволяет итерироваться по элементам списка.
Второй код делает то же самое, но он более универсален. Он может принимать список и два пустых списка в качестве аргументов. Если список пустой, то возвращаются два пустых списка. Если первый элемент списка нечетный, то он добавляется в конец списка нечетных чисел, а список четным чисел остается пустым. Если первый элемент списка четный, то он добавляется в конец списка четных чисел, а список нечетных чисел остается пустым. В противном случае рекурсивно вызывается функция task
для оставшейся части списка и двух списков, которые были переданы в качестве аргументов.
В обоих случаях результатом работы функции является два списка: один с нечетными числами, другой с четными числами.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д