P26: combination

リストからn個の要素を取り出す。
取り得る全てのパターンをリストとして列挙する。

;; P26
(defun combination (n list)
  (cond
   ((or (= n 0) (null list)) nil)
   ((= n 1) (mapcar (lambda (res) (cons res nil)) list))
   (t
    (append
     (mapcar (lambda (res)
	       (cons (car list) res)) (combination (1- n) (cdr list)))
     (combination n (cdr list))))))

(combination 1 '(a b c d))
;; => ((A) (B) (C) (D))
(combination 2 '(a b c d))
;; => ((A B) (A C) (A D) (B C) (B D) (C D))
(combination 3 '(a b c d))
;; => ((A B C) (A B D) (A C D) (B C D))
(length (combination 3 '(a b c d e f g h i j k l)))
;; => 220 (#xDC, #o334, #b11011100)