Сгруппировать двойки, нули и единицы списка без сортировки. - 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.