Archive for the ‘Lisp’ Category

Permutations

11. May 2009

No Comments »

Code to generate the permutations of a given list in Common Lisp.
Code:

(defun p (l)
  (if (null l) '(())
  (mapcan #'(lambda (x)
    (mapcar #'(lambda (y) (cons x y))
      (p (remove x l :count 1)))) l)))

Usage/Output:

* (load "permute.lsp")  

; Loading #p"/home/john/permute.lsp".
T
* (p (list 'a 'b 'c 'd 'e))

((A B C D E) (A B C E D) (A B D C E) (A B D E C) (A B E C D) (A B E D C)
 (A C B D E) (A C B E D) (A C D B E) (A C D E B) (A C E B D) (A C E D B)
 (A D B C E) (A D B E C) (A D C B E) (A D C E B) (A D E B C) (A D E C B)
 (A E B C D) (A E B D C) (A E C B D) (A E C D B) (A E D B C) (A E D C B)
 (B A C D E) (B A C E D) (B A D C E) (B A D E C) (B A E C D) (B A E D C)
 (B C A D E) (B C A E D) (B C D A E) (B C D E A) (B C E A D) (B C E D A)
 (B D A C E) (B D A E C) (B D C A E) (B D C E A) (B D E A C) (B D E C A)
 (B E A C D) (B E A D C) (B E C A D) (B E C D A) (B E D A C) (B E D C A)
 (C A B D E) (C A B E D) (C A D B E) (C A D E B) (C A E B D) (C A E D B)
 (C B A D E) (C B A E D) (C B D A E) (C B D E A) (C B E A D) (C B E D A)
 (C D A B E) (C D A E B) (C D B A E) (C D B E A) (C D E A B) (C D E B A)
 (C E A B D) (C E A D B) (C E B A D) (C E B D A) (C E D A B) (C E D B A)
 (D A B C E) (D A B E C) (D A C B E) (D A C E B) (D A E B C) (D A E C B)
 (D B A C E) (D B A E C) (D B C A E) (D B C E A) (D B E A C) (D B E C A)
 (D C A B E) (D C A E B) (D C B A E) (D C B E A) (D C E A B) (D C E B A)
 (D E A B C) (D E A C B) (D E B A C) (D E B C A) (D E C A B) (D E C B A)
 (E A B C D) (E A B D C) (E A C B D) (E A C D B) (E A D B C) (E A D C B)
 (E B A C D) (E B A D C) (E B C A D) (E B C D A) (E B D A C) (E B D C A)
 (E C A B D) (E C A D B) (E C B A D) (E C B D A) (E C D A B) (E C D B A)
 (E D A B C) (E D A C B) (E D B A C) (E D B C A) (E D C A B) (E D C B A))