Описать функцию, которая находила бы сумму всех числовых атомов в списке, учитывая все атомы подсписков - Lisp (229330)
Формулировка задачи:
Решение задачи: «Описать функцию, которая находила бы сумму всех числовых атомов в списке, учитывая все атомы подсписков»
(defun sum-num (lst) (apply '+ (mapcar (lambda (x) (if (listp x) (sum-num x) (if (numberp x) x 0))) lst))) ==> SUM-NUM (sum-num '(1 2 a b (3 4 (f g 5 6)))) ==> 21 (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 a b (3 4 (f g 5 6)))) ==> 21
Объяснение кода листинга программы
Код представляет собой функцию под названием sum-num
, которая принимает в качестве входного аргумента lst
— список.
В первом куске кода используется функция apply
, чтобы применить оператор +
к результатам, возвращаемым функцией mapcar
.
Функция mapcar
применяет к каждому элементу списка lst
лямбда-функцию, которая проверяет, является ли элемент числом или списком. Если это число, оно добавляется к сумме. Если это список, функция рекурсивно вызывает себя для этого элемента. Если это не список и не число, то возвращается ноль.
Во втором куске кода используется функция cond
, которая проверяет различные условия и возвращает соответствующее значение. Если lst
— это nil
, возвращается ноль. Если lst
— это список, функция рекурсивно вызывает себя для первого элемента списка и суммирует результат со вторым элементом. Если lst
— это число, оно добавляется к сумме. В остальных случаях функция вызывает себя для cdr
списка.
Оба куска кода выполняют одну и ту же задачу — находят сумму всех числовых атомов в списке, учитывая все атомы подсписков.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д