获得所有可能的x布尔组合(球拍,方案)

时间:2012-12-20 18:51:09

标签: lisp scheme racket

我有一个问题。如何在Racket中获得所有可能的x布尔组合? (语言水平较低)

我需要这样的东西:

对于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中这样做。

谢谢!

3 个答案:

答案 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)))