所以我一直坐在这里思考如何做到这一点而且我很卡住, 我希望它像
一样工作(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做同样的事情,但从那里开始。
答案 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的结果上的关键见解。