Вычислить сумму числовых элементов списка, учитывая элементы подсписков - Lisp
Формулировка задачи:
Доброго времени суток!
Задача состоит в следующем: Вычислить сумму числовых элементов списка, учитывая элементы подсписков.
Вот мой код.
В результате вызова функции выдает следующее:
(defun soe (lst) (cond ((null lst) 0) (( and (atom lst) (numberp lst)) lst) (t (+ (soe (car lst)) (soe (cdr lst))) )))
> (soe '( 2 3 f ( 2 g ) 2)) Error: Cannot take CAR of F.
Решение задачи: «Вычислить сумму числовых элементов списка, учитывая элементы подсписков»
textual
Листинг программы
;; просто рекурсия (defun sum-num (lst) (cond ((null lst) 0) ((listp (car lst)) (+ (sum-num (car lst)) (sum-num (cdr lst)))) ((numberp (car lst)) (+ (car lst) (sum-num (cdr lst)))) (t (sum-num (cdr lst))))) ==> SUM-NUM (sum-num '(1 2 3 a b (((c))) (((7 8))))) ==> 21 ;; итерации + рекурсия (defun sum-num (lst) (let ((s 0)) (dolist (a lst s) (cond ((listp a) (setf s (+ s (sum-num a)))) ((numberp a) (setf s (+ s a))))))) ==> SUM-NUM (sum-num '(1 2 3 a b (((c))) (((7 8))))) ==> 21 ;; функционалы + рекурсия (defun sum-num (lst) (apply '+ (mapcar (lambda (x) (cond ((listp x) (sum-num x)) ((numberp x) x) (t 0))) lst))) ==> SUM-NUM (sum-num '(1 2 3 a b (((c))) (((7 8))))) ==> 21
Объяснение кода листинга программы
В коде представлено три варианта вычисления суммы числовых элементов списка, учитывая элементы подсписков.
- Просто рекурсивный вариант:
- Функция
sum-num
принимает списокlst
в качестве входного параметра. - Если
lst
являетсяnil
, то возвращается 0. - Если
car lst
является списком, то рекурсивно вызываетсяsum-num
дляcar lst
иcdr lst
. - Если
car lst
является числом, тоcar lst
добавляется к результату рекурсивного вызоваsum-num
дляcdr lst
. - В остальных случаях, результат рекурсивного вызова
sum-num
дляcdr lst
возвращается.
- Функция
- Вариант с использованием итераций и рекурсии:
- Функция
sum-num
принимает списокlst
в качестве входного параметра. - Создается переменная
s
со значением 0. - Используется
dolist
для итерации по элементамlst
. - Если элемент
a
является списком, то рекурсивно вызываетсяsum-num
дляa
и результат добавляется кs
. - Если элемент
a
является числом, тоa
добавляется кs
. - В остальных случаях,
s
возвращается.
- Функция
- Вариант с использованием функционалов и рекурсии:
- Функция
sum-num
принимает списокlst
в качестве входного параметра. - Используется
apply
для применения функции+
к результатамmapcar
. mapcar
применяется к элементамlst
с использованием лямбда-функции, которая рекурсивно вызываетsum-num
для списков и возвращает числовые значения для чисел.- Если элемент
x
является списком, то рекурсивно вызываетсяsum-num
дляx
. - Если элемент
x
является числом, тоx
возвращается. - В остальных случаях, возвращается 0.
- Функция
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д