笛卡尔积函数采用列表列表并返回元组列表,其中元素来自第一个位置的第一个列表,元素来自第二个位置,等等。如下所示:
((1 2 3)) -> ((1) (2) (3))
((1 2) (3 4)) -> ((1 3) (1 4) (2 3) (2 4))
我正在查看我的一些旧代码,并且无法弄清楚为什么它在外部循环中附加地图而不仅仅是地图?在Racket有更多经验的人可以向我解释一下吗?
(define cartesian-product
(lambda (s)
(if (null? s)
'(())
(append-map (lambda (el1)
(map (lambda (el2)
(cons el1 el2))
(cartesian-product (cdr s))))
(car s)))))
答案 0 :(得分:1)
因为您需要压扁递归调用cartesian-product
返回的列表,否则您将获得大量不受欢迎的子列表,看看如果我们不使用{会发生什么{1}}:
append-map
将其与展平列表的结果进行比较:
(define cartesian-product
(lambda (s)
(if (null? s)
'(())
(map (lambda (el1)
(map (lambda (el2)
(cons el1 el2))
(cartesian-product (cdr s))))
(car s)))))
(cartesian-product '((1 2 3) (4 5 6)))
=> '(((1 (4)) (1 (5)) (1 (6))) ((2 (4)) (2 (5)) (2 (6))) ((3 (4)) (3 (5)) (3 (6))))