使用foldr时,您使用的过程有2个参数,列表的当前值和累加器。假设你迭代的列表是一个数字列表列表,长度相同。然后,当您遍历它们时,您希望将相同索引的数字相乘并将其存储为累加器。
如果您在lambda (x acc) (map * x acc)
中使用foldr
,则会失败,因为我认为acc
在开头是一个空列表。你怎么能像这样处理基本情况?
答案 0 :(得分:4)
这可以使用foldr
来解决,诀窍是在开头正确初始化累计值。这里不需要花哨的东西(比如宏)!
(define lst '((1 2 3) (2 3 5) (3 5 7)))
(foldr (lambda (x acc) (map * x acc))
(car lst)
(cdr lst))
=> '(6 30 105)
当然,如果列表为空(car lst)
将失败。因此,您可能希望在调用foldr
之前将空列表作为单独的案例处理。
答案 1 :(得分:0)
假设您有一个列表列表如下:
((1 2 3) (2 3 5) (3 5 7))
您希望将其缩小为:
(6 30 105)
我会这么做:
(define-syntax mul
(syntax-rules ()
((_ (lists ...)) (map * 'lists ...))))
您可以按如下方式使用它:
(mul ((1 2 3) (2 3 5) (3 5 7))) ; => (6 30 105)
以上代码只是扩展为:
(map * '(1 2 3) '(2 3 5) '(3 5 7))
然后您可以折叠结果列表。例如:
(foldr + 0 (mul ((1 2 3) (2 3 5) (3 5 7)))) ; => 141