算法之使用递归求解全排列

在python中有一个模块叫做itertools,使用这个模块能够快速的求解排列组合问题,刚好朋友问到怎么求全排列问题,不能用内置模块去做,于是。。。自己想了想逻辑,使用递归实现比较简单。

下面是简单的实现代码:

 1 #!/usr/bin/env python
 2 # encoding:utf-8
 3 # __author__: huxianglin
 4 # date: 2016/9/25 12:09
 5 # blog: http://huxianglin.cnblogs.com/ http://xianglinhu.blog.51cto.com/
 6 
 7 def perm(list,stack):
 8     if not list:
 9         print(stack)  # 到树的最后,输出结果
10     else:  # 没有到树的叶子节点的时候,使用递归继续往下找。
11         for i in range(len(list)):
12             stack.append(list[i])
13             del list[i]
14             perm(list,stack)
15             list.insert(i,stack.pop())
16 
17 list=[1,2,3]
18 stack=[]
19 perm(list,stack)

 

上面定义了两个列表,一个列表存的是需要全排列的数据,另一个列表是当做栈来用的,可以把这个递归想成一棵树,在最顶端是包含所有值得列表,之后从这个列表中循环拿掉一个值,到了第二层,这时候栈里面存放的就是拿出来的那个数据,这一层的一个值里面就少了刚刚拿掉的值,一直到最后这个列表为空的时候,栈里面存的就是这个排列的结果,把这个结果打印出来,这样不好理解,画个图来解释下吧。。。

OK,这样理解起来是不是容易多了,这样也能够解释为什么递归其实就是一棵树了。。。当然,也可以使用栈来代替递归实现,不过。。。目前还没实现。区别差不多就是树的递归遍历和非递归遍历的区别吧。

 

转载于:https://www.cnblogs.com/huxianglin/p/5906510.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值