Advertisement
Guest User

all perms N nested loops callback backtracking

a guest
Feb 13th, 2020
231
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lisp 1.57 KB | None | 0 0
  1. ;; https://stackoverflow.com/questions/49848994
  2. ;;   /how-to-generate-all-the-permutations-of-elements-in-a-list-one-at-a-time-in-lisp
  3. ;;   /49907365#49907365
  4. ;; by https://stackoverflow.com/users/849891/will-ness
  5.  
  6. (defun permutations (list callback)
  7.   (when list
  8.     (let* ((all (cons 'head (copy-list list)))           ; head sentinel FTW!
  9.            (perm (make-array (length list))))
  10.       (labels ((g (p i &optional (q (cdr p)))
  11.                 (cond
  12.                   ((null (cdr q))  
  13.                      (setf (svref perm i) (car q))       ; the last item
  14.                      (funcall callback perm))
  15.                   ((null (cddr q))  
  16.                      (setf (svref perm i) (car q))       ; the last two items
  17.                      (setf (svref perm (+ i 1)) (cadr q))  
  18.                      (funcall callback perm)
  19.                      (setf (svref perm i) (cadr q))    
  20.                      (setf (svref perm (+ i 1)) (car q))  
  21.                      (funcall callback perm))
  22.                   (T (loop while q do
  23.                         (setf (svref perm i) (car q))    ; pick the item
  24.                         (rplacd p (cdr q))               ; shrink the domain
  25.                         (g all (+ 1 i))                  ; recurse!
  26.                         (rplacd p q)                     ; heal the list back
  27.                         (pop p)  
  28.                         (pop q))))))                     ; advance the pointers
  29.         (g all 0)))))
  30.  
  31. (time (let ((c 0))
  32.   (permutations '(1 2 3) #'(lambda(p)(format t "~A " p)))      ; incf c
  33.   (print c)))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement