如何在方案中编写一个对嵌入列表中的数字求和的函数?
即 ((1) (2 3) (4) (5 6))
我写这个是为了总结常规列表:
(define (sum list)
(if (null? list)
0
(+ (car list) (sum (cdr list)))))
但我不确定如何做嵌入式。
如何在方案中编写一个对嵌入列表中的数字求和的函数?
即 ((1) (2 3) (4) (5 6))
我写这个是为了总结常规列表:
(define (sum list)
(if (null? list)
0
(+ (car list) (sum (cdr list)))))
但我不确定如何做嵌入式。
你有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
请注意,您不应使用名称“sum”和“list”,以免影响内置程序。
这是最简单的答案。
(define (sum list-of-lists)
(apply + (apply append list-of-lists)))
和“证明”:
> (sum '((1) (2 3) (4) (5 6)))
21
以更实用的方式
; this sums the elements of a not-embedded list
(define (sum-list* l)
(foldl + 0 l))
; this sums the elements of an embedded list
(define (sum-embedded-list* el)
(foldl + 0 (map sum-list* el)))
它涵盖了这样形成的列表的情况: ((a1...an) (b1...bn)...),其中 ai 和 bj 是原子。foldl 和 map 是 scheme(和其他语言)中的两个重要功能。如果你不知道如何使用它们,你应该学习。看看这里