2

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

如果你lambda (x acc) (map * x acc)在里面使用foldr,这会失败,因为acc我相信一开始是一个空列表。你怎么能处理这样的基本情况?

4

2 回答 2

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.

于 2013-04-17T18:26:39.260 回答
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
于 2013-04-17T18:01:29.083 回答