ここにアイデアがあります: 任意の数のリスト間のデカルト積を返す手続きを書きます (ヒント: アルゴリズムはググれば見つかります!)。次に、次のように、この問題を簡単に解決できます。
(return-set 1) ; is equivalent to (cartesian-product '(#t #f))
=> '((#t #f))
(return-set 2) ; is equivalent to (cartesian-product '(#t #f) '(#t #f))
=> '((#t #t) (#t #f) (#f #t) (#f #f))
(return-set 3) ; is equivalent to (cartesian-product '(#t #f) '(#t #f) '(#t #f))
=> '((#t #t #t) (#t #t #f) (#t #f #t) (#t #f #f)
(#f #t #t) (#f #t #f) (#f #f #t) (#f #f #f))
簡単にするために、値を繰り返して新しいリストを作成するプロシージャも作成しますn
。問題の解決策は、次のように簡単に表現できます。
(define (cartesian-product . lsts)
<???>) ; ToDo
(define (repeat element n)
<???>) ; ToDo
(define (return-set n)
(apply cartesian-product
(repeat '(#t #f) n)))
上記の手順を手伝うことができますが、まず、これまでに何を試したかを見てみましょう。つまり、スタック オーバーフローでは、宿題へのスプーンフィードの回答に眉をひそめています。
アップデート:
しかたがない。@GoZoner は OP の宿題に率直な答えを出したので、今答えを差し控えてもあまり意味がありません。ラケットを使用した可能な解決策は次のとおりです。
(define (cartesian-product . lsts)
(foldr (lambda (lst acc)
(for*/list ((x (in-list lst))
(y (in-list acc)))
(cons x y)))
'(())
lsts))
(define (repeat elt n)
(build-list n (const elt)))
(define (return-set n)
(apply cartesian-product
(repeat '(#t #f) n)))