如何在Scheme中编写SUM函数?

时间:2013-09-20 06:33:58

标签: scheme sum mit-scheme

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

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

我写这个来总结常规名单:

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

但我不确定如何进行嵌入式操作。

3 个答案:

答案 0 :(得分: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”,以免影响内置程序。

答案 1 :(得分:0)

这是最简单的答案。

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

和'证明':

> (sum '((1) (2 3) (4) (5 6)))
21

答案 2 :(得分:-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(和其他语言)中的两个重要函数。如果您不知道如何使用它们,您应该学习。看看here