декартовой функции продукта принимает список списков и возвращает список кортежей с элементом из первого списка в первом положении, элемент из второго в втором положении, и т.д., как показано ниже:Почему append-map вместо карты в рекурсивной декартовой функции продукта?
((1 2 3)) -> ((1) (2) (3))
((1 2) (3 4)) -> ((1 3) (1 4) (2 3) (2 4))
I» m глядя на некоторые из моего старого кода и не могу понять, почему это append-map во внешнем цикле, а не только в карте? Может ли кто-нибудь с большим опытом работы в 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)))))
Спасибо, я думаю, что я немного понимаю? Нужно ли его сглаживать, потому что карта создает несколько списков? – szhongren
@szhongren это правильно! и нас интересуют только списки верхнего уровня. –