使用递归方法实现全排列
2018-02-13 07:32
393 查看
问题:编程实现对任一集合(e.g. {a b c})的全排列。
一、原理分析
总的思路就是,将集合中的每一个元素都和第一个元素交换一下位置,这样就形成了三个新的集合——a{b,c},b{a,c},c{a,b}。再对每一个"{}"括起来的集合进行同样的操作,直到集合中只剩下一个元素时,输出结果,递归程序返回。如下所示:
第一轮交换 进一步交换 因为只剩下1个元素了,递归返回
a{b,c} ab{c} abc
ac{b} acb
b{a,c} ba{c} bac
bc{a} bca
c{b,a} cb{a} cba
ca{b} cab
二、编程实现
下面是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']DNFM0001 .......... .
一、原理分析
总的思路就是,将集合中的每一个元素都和第一个元素交换一下位置,这样就形成了三个新的集合——a{b,c},b{a,c},c{a,b}。再对每一个"{}"括起来的集合进行同样的操作,直到集合中只剩下一个元素时,输出结果,递归程序返回。如下所示:
第一轮交换 进一步交换 因为只剩下1个元素了,递归返回
a{b,c} ab{c} abc
ac{b} acb
b{a,c} ba{c} bac
bc{a} bca
c{b,a} cb{a} cba
ca{b} cab
二、编程实现
下面是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']DNFM0001 .......... .
相关文章推荐
- 数组全排列的递归方法实现
- Eclipse SWT Tree使用递归方法,实现Tree显示目录的显示
- 非递归方法用栈实现全排列
- C--全排列的实现(递归方法) 傻子也能看懂的
- 使用递归方法实现,向FTP服务器上传整个目录结构、从FTP服务器下载整个目录到本地的功能
- [C++]数据结构实验01:使用递归实现简单的全排列
- 使用asp.net递归的方法来实现treeview的数据绑定
- 使用递归方法实现数字反转 C语言实现
- 分别使用一般递归的方法和模板元编程实现台阶问题。
- JAVA使用循环和递归方法实现斐波拉切数列
- 使用递归实现全排列的算法
- 使用递归的方法去实现一棵树
- PHP数组与对象之间使用递归实现转换的方法
- 使用递归和非递归两种方法实现二分查找!!!
- 输入一个整数,使用递归方法实现反向输出
- PHP数组与对象之间使用递归实现转换的方法
- 用递归的方法实现全排列
- n的k次方,使用递归的两种实现方法
- 用递归的方法实现全排列
- 使用c语言指针和递归方法实现二分查找