Вычислить сумму числовых элементов списка, учитывая элементы подсписков - 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.
- Функция
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д