我是Scheme的新手,要理解它有很多问题。
如果我有此列表'((a . 1) (c . 3) (b . 2))
,则需要获取数字6。
我知道如何用数字而不是点对(从SO answer获得它):
(define (sum elemList)
(if
(null? elemList)
0
(+ (car elemList) (sum (cdr elemList)))
)
)
但是,如何获得点对列表中所有数字的总和?
答案 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