Описать функцию, которая находила бы сумму всех числовых элементов в списке - Lisp
Формулировка задачи:
описать функцию, которая находила бы сумму всех числовых элементов в списке. Список может содержать подсписки произвольной глубины.
Решение задачи: «Описать функцию, которая находила бы сумму всех числовых элементов в списке»
textual
Листинг программы
;; racket-lang.org (define (foo lst) (apply + (filter number? (flatten lst)))) ;; racket way (define (bar lst) (for/fold ([ sum 0]) ([i (in-list (flatten lst))]) (match i [(? number? x) (+ sum x)] [_ sum]))) (let ((lst '(1 2 (((3))) (4 a ((b)) 5 (((6 7)))) 8))) (map (lambda (f) (f lst)) `(,foo ,bar))) ;'(36 36)
Объяснение кода листинга программы
В коде определены две функции для нахождения суммы всех числовых элементов в списке.
Функция foo использует функцию filter для отфильтрованного списка числовых элементов, а затем применяет apply для суммирования.
Функция bar использует цикл for/fold, который итерирует по каждому элементу во входном списке. Если элемент является числом, он добавляет его к сумме.
В конце кода, функция map применяется к списку функций foo и bar, чтобы вызвать их с входным списком (1 2 (((3))) (4 a ((b)) 5 (((6 7)))) 8).
Результатом работы кода является (36 36), что означает, что сумма всех числовых элементов в списке равна 36.