Замена подсписка суммой - 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))
Объяснение кода листинга программы
- Функция
is-numlist
принимает аргументlst
— список чисел илиnil
, если список пуст. - Если
lst
—nil
, то возвращаетсяt
. - Если первый элемент
lst
— число, то функция рекурсивно вызывается для оставшейся части списка. - Если первый элемент
lst
— не число, то возвращаетсяnil
. - Функция
task
принимает аргументlst
— список чисел илиnil
, и возвращает результат выполнения задачи, описанной в условии. - Если
lst
—nil
, то возвращаетсяnil
. - Если первый элемент
lst
— атом, то он добавляется в начало результата, а остаток списка передается в функциюtask
рекурсивно. - Если первый элемент
lst
— число, то он добавляется в начало результата, а остаток списка передается в функциюtask
рекурсивно. - Если первый элемент
lst
— список чисел, то сначала вычисляется сумма всех чисел в списке, затем она добавляется в начало результата, а остаток списка передается в функциюtask
рекурсивно. - Если первый элемент
lst
— не атом, не число и не список чисел, то первый элемент списка передается в функциюtask
рекурсивно, а второй элемент добавляется в начало результата. - Если первый элемент
lst
— не атом и не число, то первый элемент списка передается в функциюtask
рекурсивно, а второй элемент добавляется в начало результата. - Если первый элемент
lst
— не атом, не число и не список чисел, то первый элемент списка передается в функциюtask
рекурсивно, а второй элемент добавляется в начало результата. - Если первый элемент
lst
— не атом и не число, то первый элемент списка передается в функциюtask
рекурсивно, а второй элемент добавляется в начало результата. - Если первый элемент
lst
— не атом и не число, то первый элемент списка передается в функциюtask
рекурсивно, а второй элемент добавляется в начало результата. - Если первый элемент
lst
— не атом и не число, то первый элемент списка передается в функциюtask
рекурсивно, а второй элемент добавляется в начало результата. - Если первый элемент
lst
— не атом и не число, то первый элемент списка передается в функциюtask
рекурсивно, а второй элемент добавляется в начало результата. - Если первый элемент
lst
— не атом и не число, то первый элемент списка передается в функциюtask
рекурсивно, а второй элемент добавляется в начало результата. - Если первый элемент
lst
— не атом и не число, то первый элемент списка передается в функциюtask
рекурсивно, а второй элемент добавляется в начало результата. - Если первый элемент
lst
— не атом и не число, то первый элемент списка передается в функциюtask
рекурсивно, а второй элемент добавляется в начало результата. - Если первый элемент
lst
— не атом и не число, то первый элемент списка передается в функциюtask
рекурсивно, а второй элемент добавляется в начало результата.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д