;; Функция вычисляет суммы чисел на каждом уровне вложенности списка lst (defun calculate-level-sums (lst) ;; Рекурсивная функция, которая проходит по списку lst на заданном уровне level. ;;Накапливает суммы чисел в аккумуляторе acc. Аккумулятор acc - это список пар (defun calculate-level-sums-helper (lst level acc) (cond ((null lst) acc) ; Базовый случай: если список пуст, возвращает аккумулятор (t (let ((head (car lst)) ; Берет первый элемент списка (tail (cdr lst))) ; Берет остаток списка (multiple-value-bind (new-acc remaining-tail) ; Обрабатывает текущий элемент (process-item head level acc) ; Функция process-item определяет, что делать с элементом (calculate-level-sums-helper tail level new-acc)))))) ; Рекурсивно вызывает себя для остатка списка ;; Обработка одного элемента item на заданном уровне level (defun process-item (item level acc) (cond ((numberp item) ; Если элемент - число (values (update-level-sum acc level item) nil)) ; Обновляет сумму для уровня ((listp item) ; Если элемент - список (values (calculate-level-sums-helper item (1+ level) acc) nil)) ; Рекурсивно вызывает себя для списка, увеличив уровень (t (values acc nil)))) ; Если элемент - не число и не список, игнорирует его ;; Обновление аккумулятора acc суммой для заданного уровня level (defun update-level-sum (acc level value) (let ((existing (assoc level acc))) ; Ищет существующую запись для уровня (if existing ; Если уровень уже есть в аккумуляторе (let ((new-acc (remove existing acc :test #'equal))) ; Удаляет старую запись (cons (list level (+ value (cadr existing))) new-acc)) ; Добавляет обновленную запись с новой суммой (cons (list level value) acc)))) ; Иначе, добавляет новую пару (уровень value) в аккумулятор ;; Подготавка результата (defun prepare-result (acc) (sort (cons '(1 0) acc) #'< :key #'car))) ; Иначе, добавляет (1 0) и сортирует ;; Тесты (format t "~a~%" (calculate-level-sums '(a (b (4 (2 e (3) k 15) e 5) 7)))) ; ((1 0) (2 7) (3 9) (4 17) (5 3)) (format t "~a~%" (calculate-level-sums '(a b c))) ; ((1 0)) (format t "~a~%" (calculate-level-sums '(1 (2 (3))))) ; ((1 1) (2 2) (3 3)) (format t "~a~%" (calculate-level-sums'(1 (2 3 (4 (5 6)))))) ; ((1 1) (2 5) (3 4) (4 11))
Standard input is empty
PREPARE-RESULT PREPARE-RESULT PREPARE-RESULT PREPARE-RESULT
Warning: reserving address range 0x80000c0000...0x1fffffffffff that contains memory mappings. clisp might crash later! Memory dump: 0x8000000000 - 0x80000bffff 0x14861c400000 - 0x14861c6e4fff 0x14861c815000 - 0x14861c839fff 0x14861c83a000 - 0x14861c9acfff 0x14861c9ad000 - 0x14861c9f5fff 0x14861c9f6000 - 0x14861c9f8fff 0x14861c9f9000 - 0x14861c9fbfff 0x14861c9fc000 - 0x14861c9fffff 0x14861ca00000 - 0x14861ca02fff 0x14861ca03000 - 0x14861cc01fff 0x14861cc02000 - 0x14861cc02fff 0x14861cc03000 - 0x14861cc03fff 0x14861cc80000 - 0x14861cc8ffff 0x14861cc90000 - 0x14861ccc3fff 0x14861ccc4000 - 0x14861cdfafff 0x14861cdfb000 - 0x14861cdfbfff 0x14861cdfc000 - 0x14861cdfefff 0x14861cdff000 - 0x14861cdfffff 0x14861ce00000 - 0x14861ce03fff 0x14861ce04000 - 0x14861d003fff 0x14861d004000 - 0x14861d004fff 0x14861d005000 - 0x14861d005fff 0x14861d139000 - 0x14861d13cfff 0x14861d13d000 - 0x14861d13dfff 0x14861d13e000 - 0x14861d13ffff 0x14861d140000 - 0x14861d140fff 0x14861d141000 - 0x14861d141fff 0x14861d142000 - 0x14861d142fff 0x14861d143000 - 0x14861d150fff 0x14861d151000 - 0x14861d15efff 0x14861d15f000 - 0x14861d16bfff 0x14861d16c000 - 0x14861d16ffff 0x14861d170000 - 0x14861d170fff 0x14861d171000 - 0x14861d171fff 0x14861d172000 - 0x14861d177fff 0x14861d178000 - 0x14861d179fff 0x14861d17a000 - 0x14861d17afff 0x14861d17b000 - 0x14861d17bfff 0x14861d17c000 - 0x14861d17cfff 0x14861d17d000 - 0x14861d1aafff 0x14861d1ab000 - 0x14861d1b9fff 0x14861d1ba000 - 0x14861d25ffff 0x14861d260000 - 0x14861d2f6fff 0x14861d2f7000 - 0x14861d2f7fff 0x14861d2f8000 - 0x14861d2f8fff 0x14861d2f9000 - 0x14861d30cfff 0x14861d30d000 - 0x14861d334fff 0x14861d335000 - 0x14861d33efff 0x14861d33f000 - 0x14861d340fff 0x14861d341000 - 0x14861d346fff 0x14861d347000 - 0x14861d349fff 0x14861d34c000 - 0x14861d34cfff 0x14861d34d000 - 0x14861d34dfff 0x14861d34e000 - 0x14861d34efff 0x14861d34f000 - 0x14861d34ffff 0x14861d350000 - 0x14861d350fff 0x14861d351000 - 0x14861d357fff 0x14861d358000 - 0x14861d35afff 0x14861d35b000 - 0x14861d35bfff 0x14861d35c000 - 0x14861d37cfff 0x14861d37d000 - 0x14861d384fff 0x14861d385000 - 0x14861d385fff 0x14861d386000 - 0x14861d386fff 0x14861d387000 - 0x14861d387fff 0x555cf7175000 - 0x555cf7265fff 0x555cf7266000 - 0x555cf736ffff 0x555cf7370000 - 0x555cf73cffff 0x555cf73d1000 - 0x555cf73fffff 0x555cf7400000 - 0x555cf7430fff 0x555cf7431000 - 0x555cf7434fff 0x555cf7783000 - 0x555cf77a3fff 0x7ffd2e48f000 - 0x7ffd2e4affff 0x7ffd2e4b3000 - 0x7ffd2e4b6fff 0x7ffd2e4b7000 - 0x7ffd2e4b8fff