我需要这样的东西:
对于x = 1 (名单 (列表错误) (清单真实))
对于x = 2 (名单 (列出假false) (列表false true) (列出真假) (列出真实))
对于x = 3 (名单 (列出false false false) (list false false true) (列表false true false) (list false true true) (列出true false false) (list true false true) (列出true true false) (list true true true))
等
我不知道如何在Racket中这样做。
谢谢!
答案 0 :(得分:4)
您要求列表'(#t #f)
的所有n-size 排列(不是组合!),并允许重复。为Racket调整this答案:
(define (permutations size elements)
(if (zero? size)
'(())
(append-map (lambda (p)
(map (lambda (e)
(cons e p))
elements))
(permutations (sub1 size) elements))))
像这样使用:
(permutations 3 '(#t #f))
=> '((#t #t #t) (#f #t #t) (#t #f #t) (#f #f #t)
(#t #t #f) (#f #t #f) (#t #f #f) (#f #f #f))
答案 1 :(得分:2)
以下是将数字转换为布尔值列表的一种方法。 要生成所有组合,请按照您所描述的循环使用它。
(map (λ (x) (eqv? x #\1))
(string->list (number->string 12345 2)))
将12345替换为任意数字。
答案 2 :(得分:1)
你实际上在做的是为一组x大小构建powerset。
powerset是所有可能子集的集合。例如,(列表1 2 3)的powerset是(列表(列表1 2 3)(列表1 2)(列表1 3)(列表1)(列表2 3)(列表2)(列表3)为空)
(集合是其自身的子集,空集合是所有集合的子集。)
为什么你所做的描述powerset是因为元素可以是或不在子集中。因此,apply(list true true true)将返回(list 1 2 3)并返回(list false true)将返回(list 2 3)。
这是我的问题代码。
(define baselist (list (list true) (list false)))
;; List1 List2 -> List of Lists
;; Where List1 is any list of lists, and list2 is a list of lists of size 2
;; and all of the lists within list 2 has one element
(define (list-combination list-n list-two)
(cond [(empty? list-n) empty]
[else (cons (append (first list-n) (first list-two))
(cons (append (first list-n) (second list-two))
(list-combination (rest list-n) list-two)))]))
;; tflist Number -> List of Boolean Lists
;; creates baselistn
(define (tflist n)
(cond [(= 1 n) baselist]
[else (list-combination (tlist (sub1 n)) baselist)]))
所以(tflist 3)将返回你原来的问题。 现在要做一个powerset,你可以做以下......
;; subset List1 ListofBooleans -> List
;; Determines which elements of a set to create a subset of
;; List1 and LoB are of the same length
(define (subset set t-f-list)
(cond [(empty? t-f-list) empty]
[(first t-f-list) (cons (first set) (subset (rest set) (rest t-f-list)))]
[else (subset (rest set) (rest t-f-list))]))
;;powerset set -> Powerset
;; produces a powerset of a set
(define (powerset set)
(local ((define upperbound (expt 2 (length set)))
(define tflist (tlist (length set)))
(define (powerset set n)
(cond [(= n upperbound) empty]
[else (cons (subset set (list-ref tflist n)) (powerset set (add1 n)))])))
(powerset set 0)))