(defun calculate-level-sums (lst) (calculate-level-sums-helper lst 1 '())) (defun calculate-level-sums-helper (lst level acc) (cond ((null lst) acc) ; Базовый случай: пустой список (t (multiple-value-bind (new-acc remaining-list) (process-level lst level acc) (calculate-level-sums-helper remaining-list level new-acc))))) (defun process-level (lst level acc) (cond ((null lst) (values acc nil)) ; Базовый случай: пустой список, возвращаем аккумулятор и nil, как признак окончания ((numberp (car lst)) (let ((new-acc (update-level-sum acc level (car lst)))) (values new-acc (cdr lst)))) ; Обновляем аккумулятор и переходим к следующему элементу ((listp (car lst)) (multiple-value-bind (inner-acc remaining-inner) (calculate-level-sums-helper (car lst) (1+ level) acc) ; Рекурсивно обрабатываем подсписок (values inner-acc (cdr lst)))); Возвращаем аккумулятор от подсписка и остаток исходного (t (values acc (cdr lst))))) ; Игнорируем не числовые атомы и продолжаем обработку (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)))) (defun prepare-result (acc) (let ((has-level-one (assoc 1 acc))) (if has-level-one (sort acc #'< :key #'car) (sort (cons '(1 0) acc) #'< :key #'car)))) (defun calculate-level-sums (lst) (let ((acc '())) ; Initial accumulator (let ((result (calculate-level-sums-helper lst 1 acc))) (prepare-result result))))
(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 3) (2 3) (3 10))
Standard output is empty
Warning: reserving address range 0x80000c0000...0x1fffffffffff that contains memory mappings. clisp might crash later! Memory dump: 0x8000000000 - 0x80000bffff 0x155298200000 - 0x1552984e4fff 0x155298615000 - 0x155298639fff 0x15529863a000 - 0x1552987acfff 0x1552987ad000 - 0x1552987f5fff 0x1552987f6000 - 0x1552987f8fff 0x1552987f9000 - 0x1552987fbfff 0x1552987fc000 - 0x1552987fffff 0x155298800000 - 0x155298802fff 0x155298803000 - 0x155298a01fff 0x155298a02000 - 0x155298a02fff 0x155298a03000 - 0x155298a03fff 0x155298a80000 - 0x155298a8ffff 0x155298a90000 - 0x155298ac3fff 0x155298ac4000 - 0x155298bfafff 0x155298bfb000 - 0x155298bfbfff 0x155298bfc000 - 0x155298bfefff 0x155298bff000 - 0x155298bfffff 0x155298c00000 - 0x155298c03fff 0x155298c04000 - 0x155298e03fff 0x155298e04000 - 0x155298e04fff 0x155298e05000 - 0x155298e05fff 0x155298f83000 - 0x155298f86fff 0x155298f87000 - 0x155298f87fff 0x155298f88000 - 0x155298f89fff 0x155298f8a000 - 0x155298f8afff 0x155298f8b000 - 0x155298f8bfff 0x155298f8c000 - 0x155298f8cfff 0x155298f8d000 - 0x155298f9afff 0x155298f9b000 - 0x155298fa8fff 0x155298fa9000 - 0x155298fb5fff 0x155298fb6000 - 0x155298fb9fff 0x155298fba000 - 0x155298fbafff 0x155298fbb000 - 0x155298fbbfff 0x155298fbc000 - 0x155298fc1fff 0x155298fc2000 - 0x155298fc3fff 0x155298fc4000 - 0x155298fc4fff 0x155298fc5000 - 0x155298fc5fff 0x155298fc6000 - 0x155298fc6fff 0x155298fc7000 - 0x155298ff4fff 0x155298ff5000 - 0x155299003fff 0x155299004000 - 0x1552990a9fff 0x1552990aa000 - 0x155299140fff 0x155299141000 - 0x155299141fff 0x155299142000 - 0x155299142fff 0x155299143000 - 0x155299156fff 0x155299157000 - 0x15529917efff 0x15529917f000 - 0x155299188fff 0x155299189000 - 0x15529918afff 0x15529918b000 - 0x155299190fff 0x155299191000 - 0x155299193fff 0x155299196000 - 0x155299196fff 0x155299197000 - 0x155299197fff 0x155299198000 - 0x155299198fff 0x155299199000 - 0x155299199fff 0x15529919a000 - 0x15529919afff 0x15529919b000 - 0x1552991a1fff 0x1552991a2000 - 0x1552991a4fff 0x1552991a5000 - 0x1552991a5fff 0x1552991a6000 - 0x1552991c6fff 0x1552991c7000 - 0x1552991cefff 0x1552991cf000 - 0x1552991cffff 0x1552991d0000 - 0x1552991d0fff 0x1552991d1000 - 0x1552991d1fff 0x5651c4142000 - 0x5651c4232fff 0x5651c4233000 - 0x5651c433cfff 0x5651c433d000 - 0x5651c439cfff 0x5651c439e000 - 0x5651c43ccfff 0x5651c43cd000 - 0x5651c43fdfff 0x5651c43fe000 - 0x5651c4401fff 0x5651c52dd000 - 0x5651c52fdfff 0x7ffd2907f000 - 0x7ffd2909ffff 0x7ffd290c5000 - 0x7ffd290c8fff 0x7ffd290c9000 - 0x7ffd290cafff