Сгруппировать двойки, нули и единицы списка без сортировки. - Lisp
Формулировка задачи:
Помогите,пожалуйста, требуется решить задачу c помощью рекурсии без использования &optional, initional element.
В числовом списке каждый элемент равен 0, 1 или 2. Переставить элементы списка так, чтобы сначала располагались все нули, затем все единицы и, наконец, все двойки (сортировать список нельзя!)
Решение задачи: «Сгруппировать двойки, нули и единицы списка без сортировки.»
textual
Листинг программы
(defun counter (lst zero one two) (cond ((null lst) (append zero one two)) ((zerop (car lst)) (counter (cdr lst) (cons 0 zero) one two)) ((= 1 (car lst)) (counter (cdr lst) zero (cons 1 one) two)) (t (counter (cdr lst) zero one (cons 2 two))))) ==> COUNTER (defun task (lst) (counter lst nil nil nil)) ==> TASK (task '(1 2 1 2 0 0 0 1 2 2 0)) ==> (0 0 0 0 1 1 1 2 2 2 2)
Объяснение кода листинга программы
В коде представлена функция counter
, которая группирует двойки, нули и единицы в списке без сортировки.
Список делится на три группы:
- Двойки:
(cons 0 zero)
. - Нули:
(cons 1 one)
. - Единицы:
(cons 2 two)
. Вот список элементов кода с соответствующими номерами: (defun counter (lst zero one two) ...)
- Заголовок функции с номером 1.(cond ((null lst) (append zero one two)))
- Начальное условие для пустого списка.(cond ((zerop (car lst)) (counter (cdr lst) (cons 0 zero) one two)))
- Если первый элемент списка равен нулю, рекурсивно вызывается функцияcounter
для оставшейся части списка, и к результату добавляется(cons 0 zero)
.(cond ((= 1 (car lst)) (counter (cdr lst) zero (cons 1 one) two)))
- Если первый элемент списка равен 1, рекурсивно вызывается функцияcounter
для оставшейся части списка, и к результату добавляется(cons 1 one)
.(t (counter (cdr lst) zero one (cons 2 two)))
- Если первый элемент списка не равен 0 или 1, рекурсивно вызывается функцияcounter
для оставшейся части списка, и к результату добавляется(cons 2 two)
.(defun task (lst) (counter lst nil nil nil))
- Заголовок функции с номером 6.(task '(1 2 1 2 0 0 0 1 2 2 0))
- Вызов функцииtask
с заданным списком.(0 0 0 0 1 1 1 2 2 2 2)
- Результат выполнения функцииtask
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д