如何在计划中使用foldr?

时间:2013-04-17 17:18:50

标签: scheme

使用foldr时,您使用的过程有2个参数,列表的当前值和累加器。假设你迭代的列表是一个数字列表列表,长度相同。然后,当您遍历它们时,您希望将相同索引的数字相乘并将其存储为累加器。

如果您在lambda (x acc) (map * x acc)中使用foldr,则会失败,因为我认为acc在开头是一个空列表。你怎么能像这样处理基本情况?

2 个答案:

答案 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