Некоторые замечания
- Вы можете записать свой список
list
, нет необходимости сокращать его до lst
. - Все ветви в вашем коде приводят к рекурсивномупозвоните по номеру
summit
, нет случая, когда вы прекратите вычислять результат. Это бесконечное вычисление занимает место в стеке, поэтому в конечном итоге оно останавливается с переполнением стека. - Пожалуйста, сделайте отступ в вашем коде обычным способом (прочитайте, например, это руководство по стилю )
Обратите внимание, что случай, когда элемент равен nil
, не сильно отличается от случая, когда список ввода пуст. С помощью следующего кода оба обрабатываются одинаково:
(defun sum (val)
(if (consp val)
(+ (sum (car val))
(sum (cdr val)))
(or val 0)))
Это также означает, что код может делать больше, чем ожидалось, т.е. вы можете суммировать числа в дереве:
(sum '(0 1 2 nil 4 5 7 (1 2)))
=> 22
И это также работает, когда вводом является просто число:
(sum 5)
=> 5