How to do a powerset in DrRacket?

后端 未结 5 745
予麋鹿
予麋鹿 2020-11-28 14:41

I\'m using the beginning language with list abbreviations for DrRacket and want to make a powerset recursively but cannot figure out how to do it. I currently have this much

相关标签:
5条回答
  • 2020-11-28 15:11

    Here's my implementation of power set (though I only tested it using standard Racket language, not Beginning Student):

    (define (powerset lst)
      (if (null? lst)
          '(())
          (append-map (lambda (x)
                        (list x (cons (car lst) x)))
                      (powerset (cdr lst)))))
    

    (Thanks to samth for reminding me that flatmap is called append-map in Racket!)

    0 讨论(0)
  • 2020-11-28 15:16

    In Racket,

    #lang racket
    
    (define (power-set xs)
      (cond
        [(empty? xs) (list empty)]                 ; the empty set has only empty as subset
        [(cons? xs)  (define x  (first xs))        ; a constructed list has a first element
                     (define ys (rest  xs))        ; and a list of the remaining elements
                     ;; There are two types of subsets of xs, thouse that
                     ;; contain x and those without x.
                     (define with-out-x            ; the power sets without x
                       (power-set ys))                 
                     (define with-x                ; to get the power sets with x we 
                       (cons-all x with-out-x))    ; we add x to the power sets without x
                     (append with-out-x with-x)])) ; Now both kind of subsets are returned.
    
    (define (cons-all x xss)
      ; xss is a list of lists
      ; cons x onto all the lists in xss
      (cond
        [(empty? xss) empty]
        [(cons?  xss) (cons (cons     x (first xss))    ; cons x to the first sublist
                            (cons-all x (rest xss)))])) ; and to the rest of the sublists
    

    To test:

    (power-set '(a b c))
    
    0 讨论(0)
  • 2020-11-28 15:20

                What's in a powerset? A set's subsets! 
                An empty set is any set's subset,
                so powerset of empty set's not empty. 
                Its (only) element it is an empty set:

    (define
      (powerset aL)
      (cond
        [(empty? aL) (list empty)]
        [else
    

                As for non-empty sets, there is a choice,
                for each set's element, whether to be
                or not to be included in subset
                which is a member of a powerset. 
    We thus include
    both choices when combining first element with smaller powerset, that, which we get recursively applying the same procedure to the rest of input:

           (combine (first aL)
                    (powerset (rest aL)))]))
    
    (define
      (combine a r)                         ; `r` for Recursive Result
      (cond
        [(empty? r)  empty]                 ; nothing to combine `a` with
        [else
          (cons (cons a (first r))          ; Both add `a` and
                (cons (first r)             ;   don't add, to first subset in `r`
                      (combine              ; and do the same
                          a                 ;   with 
                          (rest r))))]))    ;   the rest of `r`
    

                "There are no answers, only choices". Rather, 
                the choices made, are what the answer's made of.

    0 讨论(0)
  • 2020-11-28 15:25

    You can just use side effect:

    (define res '())
    
    (define
      (pow raw leaf)
      (cond
        [(empty? raw) (set! res (cons leaf res))
                      res]
        [else (pow (cdr raw) leaf)
              (pow (cdr raw) (cons (car raw) leaf))]))
    
    (pow '(1 2 3) '())
    
    0 讨论(0)
  • 2020-11-28 15:33

    Here's yet another implementation, after a couple of tests it appears to be faster than Chris' answer for larger lists. It was tested using standard Racket:

    (define (powerset aL)
      (if (empty? aL)
          '(())
          (let ((rst (powerset (rest aL))))
            (append (map (lambda (x) (cons (first aL) x))
                         rst)
                    rst))))
    
    0 讨论(0)
提交回复
热议问题