Замена подсписка суммой - Lisp

Узнай цену своей работы

Формулировка задачи:

Подскажите, как с помощью рекурсии решить задание Имеется произвольный список, состоящий из числовых атомов. Преобразовать список по следующему правилу: если элементы некоторого подсписка являются числами, заменить подсписок суммой его элементов. Пример: (1 (2 ( 3 4 5) 6)(7 8 9)) —> (1(2 (12) 6)(24))

Решение задачи: «Замена подсписка суммой»

textual
Листинг программы
(defun is-numlist (lst) ;; Функция проверяет, является ли аргумент списком чисел
  (cond ((null lst) t)
        ((numberp (car lst)) (is-numlist (cdr lst)))
        (t nil)))  
 
==> is-numlist
 
(is-numlist '(1 2 3)) 
 
==> T ;; верно
 
(is-numlist '(1 2 a 3))
 
==> NIL ;; верно
 
(defun task (lst) ;; Решение
  (cond ((null lst) nil)
        ((atom (car lst)) (cons (car lst) (task (cdr lst))))
        ((is-numlist (car lst)) (cons (list (apply '+ (car lst))) (task (cdr lst))))
        (t (cons (task (car lst)) (task (cdr lst))))))
 
==> task
 
(task '(1 (2 ( 3 4 5) 6) (7 8 9)))
 
==> (1 (2 (12) 6) (24))

Объяснение кода листинга программы

  1. Функция is-numlist принимает аргумент lst — список чисел или nil, если список пуст.
  2. Если lstnil, то возвращается t.
  3. Если первый элемент lst — число, то функция рекурсивно вызывается для оставшейся части списка.
  4. Если первый элемент lst — не число, то возвращается nil.
  5. Функция task принимает аргумент lst — список чисел или nil, и возвращает результат выполнения задачи, описанной в условии.
  6. Если lstnil, то возвращается nil.
  7. Если первый элемент lst — атом, то он добавляется в начало результата, а остаток списка передается в функцию task рекурсивно.
  8. Если первый элемент lst — число, то он добавляется в начало результата, а остаток списка передается в функцию task рекурсивно.
  9. Если первый элемент lst — список чисел, то сначала вычисляется сумма всех чисел в списке, затем она добавляется в начало результата, а остаток списка передается в функцию task рекурсивно.
  10. Если первый элемент lst — не атом, не число и не список чисел, то первый элемент списка передается в функцию task рекурсивно, а второй элемент добавляется в начало результата.
  11. Если первый элемент lst — не атом и не число, то первый элемент списка передается в функцию task рекурсивно, а второй элемент добавляется в начало результата.
  12. Если первый элемент lst — не атом, не число и не список чисел, то первый элемент списка передается в функцию task рекурсивно, а второй элемент добавляется в начало результата.
  13. Если первый элемент lst — не атом и не число, то первый элемент списка передается в функцию task рекурсивно, а второй элемент добавляется в начало результата.
  14. Если первый элемент lst — не атом и не число, то первый элемент списка передается в функцию task рекурсивно, а второй элемент добавляется в начало результата.
  15. Если первый элемент lst — не атом и не число, то первый элемент списка передается в функцию task рекурсивно, а второй элемент добавляется в начало результата.
  16. Если первый элемент lst — не атом и не число, то первый элемент списка передается в функцию task рекурсивно, а второй элемент добавляется в начало результата.
  17. Если первый элемент lst — не атом и не число, то первый элемент списка передается в функцию task рекурсивно, а второй элемент добавляется в начало результата.
  18. Если первый элемент lst — не атом и не число, то первый элемент списка передается в функцию task рекурсивно, а второй элемент добавляется в начало результата.
  19. Если первый элемент lst — не атом и не число, то первый элемент списка передается в функцию task рекурсивно, а второй элемент добавляется в начало результата.
  20. Если первый элемент lst — не атом и не число, то первый элемент списка передается в функцию task рекурсивно, а второй элемент добавляется в начало результата.

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


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

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

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