fork download
  1. ; powerset
  2.  
  3. (define (power-set xs)
  4. (if (null? xs) (list (list))
  5. (let ((rest (power-set (cdr xs))))
  6. (append rest (map (lambda (x) (cons (car xs) x)) rest)))))
  7.  
  8. (display (power-set '(1 2 3))) (newline)
  9.  
  10. (define (bits n len)
  11. (let loop ((n n) (len len) (bs (list)))
  12. (if (zero? len) bs
  13. (loop (quotient n 2) (- len 1)
  14. (cons (if (odd? n) 1 0) bs)))))
  15.  
  16. (define (collect n xs)
  17. (let loop ((bs (bits n (length xs))) (xs xs) (zs (list)))
  18. (if (null? bs) zs
  19. (loop (cdr bs) (cdr xs)
  20. (if (zero? (car bs)) zs (cons (car xs) zs))))))
  21.  
  22. (define (power-set xs)
  23. (do ((n 0 (+ n 1)) (xss (list) (cons (collect n xs) xss)))
  24. ((= n (expt 2 (length xs))) xss)))
  25.  
  26. (display (power-set '(1 2 3))) (newline)
  27.  
  28. (define (for-power-set op xs)
  29. (let ((len (length xs)))
  30. (do ((n 0 (+ n 1))) ((= n (expt 2 len)))
  31. (op (collect n xs)))))
  32.  
  33. (for-power-set (lambda (s) (display s) (newline)) '(1 2 3))
Success #stdin #stdout 0.01s 7280KB
stdin
Standard input is empty
stdout
(() (3) (2) (2 3) (1) (1 3) (1 2) (1 2 3))
((3 2 1) (2 1) (3 1) (1) (3 2) (2) (3) ())
()
(3)
(2)
(3 2)
(1)
(3 1)
(2 1)
(3 2 1)