使用递归方法实现全排列

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值