问题:编程实现对任一集合(e.g. {a b c})的全排列。
一、原理分析
总的思路就是,将集合中的每一个元素都和第一个元素交换一下位置,这样就形成了三个新的集合——a{b,c},b{a,c},c{a,b}。再对每一个"{}"括起来的集合进行同样的操作,直到集合中只剩下一个元素时,输出结果,递归程序返回。如下所示:
第一轮交换 | 进一步交换 | 因为只剩下1个元素了,递归返回
a {b, c} | a b {c} | a b c
| a c {b} | a c b
b {a, c} | b a {c} | b a c
| b c {a} | b c a
c {b, a} | c b {a} | c b a
| c a {b} | c a b
二、编程实现
下面是Python写的实现代码:
# -*- coding:utf-8 -*-
# 功能:递归函数,在设计时要考虑好参数的用途。
# list:要实现全排列的list。
# n:从第几个元素开始进行全排列。
def perm(list, n):
if n == len(list) - 1: #递归返回条件
print list
else:
i = n
while i < len(list):
swap(list, n, i) #交换
perm(list, n + 1) #递归调用
swap(list, n, i) #回复原样
i += 1
def swap(list, i, j):
temp = list[i]
list[i] = list[j]
list[j] = temp
list = ['a', 'b', 'c']
perm(list, 0)
输出结果为:
['a', 'b', 'c']
['a', 'c', 'b']
['b', 'a', 'c']
['b', 'c', 'a']
['c', 'b', 'a']
['c', 'a', 'b']