将点对列表中的所有数字相加

时间:2018-10-18 10:24:19

标签: list scheme

我是Scheme的新手,要理解它有很多问题。

如果我有此列表'((a . 1) (c . 3) (b . 2)),则需要获取数字6。

我知道如何用数字而不是点对(从SO answer获得它):

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

但是,如何获得点对列表中所有数字的总和?

1 个答案:

答案 0 :(得分:1)

这是您可以执行的操作:

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

只需取每个元素cdr中的car。用car部分提取列表的第一个,用cdr提取列表对的第二个元素。我们甚至可以简化一下:

(cdr (car elemList))

等效于此:

(cdar elemList)

但是在Scheme中,我们更喜欢使用内置函数来编写解决方案,因此编写它的一种更加惯用的方式是:

(define (sum elemList)
  (apply + (map cdr elemList)))

我们采用列表中每对的cdr,然后将它们全部加在一起。简短,美观,简单。以上任何一种解决方案都可以按预期工作:

(sum '((a . 1) (c . 3) (b . 2)))
=> 6