Code: Select all
(define (func element items)
(map (fn (permutation) (cons element permutation))
(permutations (clean
(fn (f) (= element f))
items))))
(define (permutations items)
(if (nil? items)
nil
(apply list
(map
(fn (f) (func f items))
items
))))
(println (permutations '(1 2 3 4)))
;-> (((1 (2 (3)) (2 (4))) (1 (3 (2)) (3 (4))) (1 (4 (2)) (4 (3)))) ((2
(1 (3))
(1 (4)))
(2 (3 (1)) (3 (4)))
(2 (4 (1)) (4 (3))))
((3 (1 (2)) (1 (4))) (3 (2 (1)) (2 (4))) (3 (4 (1)) (4 (2))))
((4 (1 (2)) (1 (3))) (4 (2 (1)) (2 (3))) (4 (3 (1)) (3 (2)))))