0

如何在方案中编写一个对嵌入列表中的数字求和的函数?

即 ((1) (2 3) (4) (5 6))

我写这个是为了总结常规列表:

(define (sum list)
  (if (null? list)
      0
      (+ (car list) (sum (cdr list)))))

但我不确定如何做嵌入式。

4

3 回答 3

3

你有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”,以免影响内置程序。

于 2013-09-20T08:13:04.700 回答
0

这是最简单的答案。

(define (sum list-of-lists)
  (apply + (apply append list-of-lists)))

和“证明”:

> (sum '((1) (2 3) (4) (5 6)))
21
于 2013-09-20T17:28:14.243 回答
-1

以更实用的方式

; 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(和其他语言)中的两个重要功能。如果你不知道如何使用它们,你应该学习。看看这里

于 2013-09-20T08:45:46.467 回答