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)