(define (remove items sequence)
(filter (lambda (x) (not (= x items)))
sequence))
;思路:
;对s中的每一个元素x,递归生成s-x后的所有的排列
;然后将x加到该排列的前面,得到以x开头的所有的排列
;然后将所有的x的排列组合起来
(define (permutations s)
(if (null? s)
(list nil)
(flatmap (lambda (x) ;递归s里面的每个元素x
(map (lambda (p) ;p为s-x的排列中的每个元素,最终必须是一个空列表,而不能是nil
(cons x p))
(permutations (remove x s)))) ;将x加到s-x的排列的前面
s)))
(permutations (list 1 2 3))