У вас есть 3 случая:
(define (my-sum lst)
(cond
; 1. the list is empty, so finish of by adding 0
([empty? lst] 0)
; 2. the first element is a list, so recurse down on the sublist, then do the rest
([list? (car lst)] (+ (my-sum (car lst)) (my-sum (cdr lst))))
; 3. add the first element to the sum, then do the rest
(else (+ (car lst) (my-sum (cdr lst))))))
так что вы просто пропавшие средний случай.
Это будет работать независимо от глубины вложенности:
(my-sum '((1) (2 3) (4) (5 6)))
=> 21
(my-sum '((1) (2 3) (4) (5 6 (7 8 (9)))))
=> 45
Пожалуйста, обратите внимание, что вы не должны использовать имена «сумма» и «список», чтобы не затенять Построенные в процедуры.
Ничего плохого затенения встроенных команд, которые не используются в процедуре, как это не будет течь связыванию вне определения. – Sylwester
@ Sylwester Это сработает, но я считаю, что это плохая практика, но это рано или поздно укусит вас. – uselpa
спасибо большое !!! – Layla