1

だから私はここに座ってこれを行う方法を考えていましたが、かなり行き詰まっています。

(Return_Set 2)  returns=> ((#t, #t) (#t, #f) (#f, #t) (#f, #f))
(Return_Set 1)  returns=> ((#t) (#f))
(define (Return_Set N) 

(/ (expt 2 N) 2)はすべてを入れて#tから追加する必要があることを知っています:

(Return_Set N-1) 

#f についても同じことを行いますが、そこからです。

4

2 に答える 2

1

ここにアイデアがあります: 任意の数のリスト間のデカルト積を返す手続きを書きます (ヒント: アルゴリズムはググれば見つかります!)。次に、次のように、この問題を簡単に解決できます。

(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)))
于 2013-03-04T21:22:00.430 に答える
0

これで完了です:

(define (return-set n)
  (define (cons-of x)
    (lambda (l) (cons x l)))
  (assert (positive? n))
  (if (= n 1)
      '((#t) (#f))
      (let ((n_1 (return-set (- n 1))))
        (append (map (cons-of #f) n_1)
                (map (cons-of #t) n_1)))))

N の結果が単に N-1 の結果に基づいていることを認識することが重要な洞察です。

于 2013-03-04T22:21:44.107 に答える