Я пытался сделать функцию, которая возвращает Декартово Пересечение множеств n в докторе Scheme, наборы даны как список списков, я весь день застревал в этом, я хотел бы несколько инструкций как, где запустить.
----БОЛЕЕ ПОЗДНЕЕ РЕДАКТИРОВАНИЕ-----
Вот решение, которое я предложил, я уверен, что это не безусловно большая часть efficent или аккуратный, но я только изучаю Схему в течение 3 недель так снисходительно отнестись ко мне.
;returs a list wich looks like ((nr l[0]) (nr l[1])......)
(define cart-1(λ(l nr)
(if (null? l)
l
(append (list (list nr (car l))) (cart-1 (cdr l) nr)))))
;Cartesian product for 2 lists
(define cart-2(λ(l1 l2)
(if(null? l2)
'()
(append (cart-1 l1 (car l2)) (cart-2 l1 (cdr l2))))))
;flattens a list containg sublists
(define flatten
(λ(from)
(cond [(null? from) from]
[(list? (car from)) (append (flatten (car from)) (flatten (cdr from)))]
[else (cons (car from) (flatten (cdr from)))])})
;applys flatten to every element of l
(define flat
(λ(l)
(if(null? l)
l
(cons (flatten (car l)) (flat (cdr l))))))
;computes Cartesian product for a list of lists by applying cart-2
(define cart
(lambda (liste aux)
(if (null? liste)
aux
(cart (cdr liste) (cart-2 (car liste) aux)))))
(define (cart-n l) (flat (cart (cdr l ) (car l))))
Вот мое первое решение (неоптимальное):
#lang scheme
(define (cartesian-product . lofl)
(define (cartOf2 l1 l2)
(foldl
(lambda (x res)
(append
(foldl
(lambda (y acc) (cons (cons x y) acc))
'() l2) res))
'() l1))
(foldl cartOf2 (first lofl) (rest lofl)))
(cartesian-product '(1 2) '(3 4) '(5 6))
В основном вы хотите произвести продукт продукта списков.
;compute the list of the (x,y) for y in l
(define (pairs x l)
(define (aux accu x l)
(if (null? l)
accu
(let ((y (car l))
(tail (cdr l)))
(aux (cons (cons x y) accu) x tail))))
(aux '() x l))
(define (cartesian-product l m)
(define (aux accu l)
(if (null? l)
accu
(let ((x (car l))
(tail (cdr l)))
(aux (append (pairs x m) accu) tail))))
(aux '() l))
Источник: Вложенные циклы и рекурсия Scheme / Lisp