Описать функцию, которая находила бы сумму всех числовых атомов в списке, учитывая все атомы подсписков - 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 списка.
Оба куска кода выполняют одну и ту же задачу — находят сумму всех числовых атомов в списке, учитывая все атомы подсписков.