接受X并返回#t / #f的所有集合的函数

时间:2013-03-04 20:33:04

标签: scheme

所以我一直坐在这里思考如何做到这一点而且我很卡住, 我希望它像

一样工作
(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做同样的事情,但从那里开始。

2 个答案:

答案 0 :(得分:1)

这是一个想法:编写一个程序,在任意数量的列表之间返回cartesian product(提示:你将通过谷歌搜索找到算法!)。那么你就能轻松解决这个问题,如下所示:

(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)))

我可以帮助你完成上述程序,但首先让我们看看你到目前为止尝试了什么,我的意思是:使用Stack Overflow工作代码的真正努力,它不赞成用勺子喂答家庭作业的答案。

<强>更新

哦,好吧。 @GoZoner直截了当地回答了OP的作业,所以现在拒绝我的回答没有多大意义。以下是使用Racket的可能解决方案:

(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)))

答案 1 :(得分: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的结果上的关键见解。