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

  1. Двойки: (cons 0 zero).
  2. Нули: (cons 1 one).
  3. Единицы: (cons 2 two). Вот список элементов кода с соответствующими номерами:
  4. (defun counter (lst zero one two) ...) - Заголовок функции с номером 1.
  5. (cond ((null lst) (append zero one two))) - Начальное условие для пустого списка.
  6. (cond ((zerop (car lst)) (counter (cdr lst) (cons 0 zero) one two))) - Если первый элемент списка равен нулю, рекурсивно вызывается функция counter для оставшейся части списка, и к результату добавляется (cons 0 zero).
  7. (cond ((= 1 (car lst)) (counter (cdr lst) zero (cons 1 one) two))) - Если первый элемент списка равен 1, рекурсивно вызывается функция counter для оставшейся части списка, и к результату добавляется (cons 1 one).
  8. (t (counter (cdr lst) zero one (cons 2 two))) - Если первый элемент списка не равен 0 или 1, рекурсивно вызывается функция counter для оставшейся части списка, и к результату добавляется (cons 2 two).
  9. (defun task (lst) (counter lst nil nil nil)) - Заголовок функции с номером 6.
  10. (task '(1 2 1 2 0 0 0 1 2 2 0)) - Вызов функции task с заданным списком.
  11. (0 0 0 0 1 1 1 2 2 2 2) - Результат выполнения функции task.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.556 из 5
Похожие ответы