[DNFM0001] 使用递归方法实现全排列

问题:编程实现对任一集合(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(16)

猜你喜欢

转载自blog.csdn.net/hanjing_csdn/article/details/79319773
今日推荐