我在百度,触宝面试的时候,他们都问到了递归。

递归是一个很有意思的问题,其中的经典问题有汉诺塔,fibonacci 数列问题。汉诺塔是比较难的问题,fibonacci 是比较简单的问题。

触宝面试的时候,面试官问我如何对一个数组进行全排列。全排列的意思是,给定一个数组[1,2,3],列出它所有可能的排列方式:[1,2,3],[1,3,2],[2,3,1],[2,1,3],[3,1,2],[3,2,1]共6种。面试官就提示我可以用递归来做。

我们看一下人脑思维针对全排列所给出的排列方式:

数组为[1,2,3]时,步骤如下:

1放第一位,然后全排列数组[2,3],得到[1,2,3],[1,3,2]
2放第一位,然后全排列数组[1,3],得到[2,1,3],[2,3,1]
3放第一位,然后全排列数组[1,2],得到[3,1,2],[3,2,1]

数组为[1,2]时,排列有两种:[1,2],[2,1]。排列步骤如下:
1放第一位,然后全排列数组[2],得到[1,2]
2放第一位,然后全排列数组[1],得到[2,1]

数组为[1]时, 排列方式只有一种:[1]

可以看到当前问题都会基于上一个小问题的解决。这就可以用到递归的方法。

全排列的递归代码如下:

COUNT=0
def perm(n,begin,end):global COUNTif begin>=end:print nCOUNT +=1else:i=beginfor num in range(begin,end):#依次进行换位n[num],n[i]=n[i],n[num]perm(n,begin+1,end)n[num],n[i]=n[i],n[num]#对于上一个递归来说,置换回来的,还要置换回去
n=[1,2,3,4]
perm(n,0,len(n))
print COUNT

求了全排列之后,我们用递归的方法求一下全组合。

全组合也可以看作是求一个集合的所有子集。

例子,{1,2,3}的所有子集就是{1},{2},{3},{1,2},{1,3},{2,3},{1,2,3}以及空集合{}。

组合排列,排列组合。


def PowerSetsRecursive(items):"""Use recursive call to return all subsets of items, include empty set"""if len(items) == 0:#if the list is empty, return the empty listreturn [[]]subsets = []first_elt = items[0] #first elementrest_list = items[1:]#Strategy:Get all subsets of rest_list; for each of those subsets, a full subset list#will contain both the original subset as well as a version of the sebset that contains the first_eltfor partial_sebset in PowerSetsRecursive(rest_list):subsets.append(partial_sebset)next_subset = partial_sebset[:] +[first_elt]subsets.append(next_subset)return subsetsitems = [1,2,3,4]
print PowerSetsRecursive(items)

运行结果:
[[], [1], [2], [2, 1], [3], [3, 1], [3, 2], [3, 2, 1], [4], [4, 1], [4, 2], [4, 2, 1], [4, 3], [4, 3, 1], [4, 3, 2], [4, 3, 2, 1]]

递归 求全排列与全组合相关推荐

  1. Java递归求全排列详解

    Java递归求全排列详解 推荐博客: 博客园Java全排列递归算法,结尾的解释很形象了 csdn的大佬写的,和我下面的代码思路基本一致 全排列的递归思想解释: 全排列的数学定义就不再过多解释,考虑递归 ...

  2. 递归求全排列的学习与理解

    递归求全排列 全排列: 从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列.当m=n时所有的排列情况叫全排列. 例题: 输出自然数 1 到n所有 ...

  3. 不使用递归求全排列和组合数

    同学遇到的面试问题,大意是M台机器放在N个房间,不使用递归求打印所有情况 解题思路:情况共计N**M种.开始想将所有情况放入数组,填充好数组再逐个打印.随后发现按照填充的思路,不使用大数组也可以实现. ...

  4. C++ STL求全排列和组合

    C++11 STL内置了求全排列的模板函数next_permutation和prev_permutation,属于<algorithm>头文件和std命名空间,使用非常方便.例如: vec ...

  5. 递归实现排列组合问题

    在做递归问题时,要保证对递归跳跃的信任,继而对相应的问题寻找其递归实现 (1)组合:先从原始数组中选择一个,再从剩下的集合中选择m-1个:而后,再从剩下的集合中挑选m个元素. /*组合代码(eg:5选 ...

  6. 背包问题算法实现(全组合、暴力递归、动态规划及空间压缩、对数器)

    背包问题的实现 * 1.全组合解法(对数器) * 2.暴力递归解法 * 3.动态规划解法 * 4.动态规划(省空间)解法 对数器的思路是:求解n个物品的全组合中不超过背包容量的组合对应的最大价值(时间 ...

  7. 排列组合算法(全排列、全组合)

    原文链接 http://blog.shuxuemi.cn/web/index/detail/16 // 全排 function fullArrange(&$arr, $index) {if ( ...

  8. 全排列、全组合 java实现

    全排列 所谓全排列就是根据输入字符打印出所有字符的排列方式(分次序).例如输入abc,所有排序的结果有,abc,cba,bac,cab,acb,bca 共6种情况.对于全排列,如果用循环的方法,需要O ...

  9. 三种求全排列方式之比较

    一共有三种求全排列的方式: 第一种就是只适合用于非可重集的DFS实现 第二种就是可以用于可重集上的刘汝佳书上的代码 第三种就是STL中的next--permutation 在对这三种方式做了比较之后发 ...

最新文章

  1. VTK:几何对象之Cone
  2. urllib2设置代理
  3. 词性标注与命名实体识别
  4. session 和cookie的理解
  5. centos7 安装 python3.5
  6. P4070 [SDOI2016]生成魔咒
  7. easyui的textbox实现编辑保存_第80讲:工作表数据与UserForm窗口的交互,记录的编辑和保存...
  8. 神奇的机器人评课_《机器人》教学反思
  9. hightcharts 如何修改legend图例的样式
  10. iOS popViewController 失败
  11. 港交所、中芯国际、京东、诺基亚等公司高管变动
  12. 如何做好Windows2003服务器安全策略
  13. hustoj安装16种判题语言
  14. Linux DMA驱动构架分析
  15. 第11章 角色页的删除、批量删除
  16. Qt官方示例-QLineEdit编辑器
  17. 那些诡异的黑客事件 一
  18. 大连计算机学校贾佳,大连市第二十四中学信息学奥赛喜报频传
  19. dpdk 内核模块 Unknown symbol in module 问题
  20. Python中的进程池

热门文章

  1. Python爬虫爬取新浪新闻内容
  2. 钉钉机器人智能回复_契约机器人开发教程-新人入群智能回复|良心开发工作室...
  3. command line/shell/bash
  4. 【报告分享】2022中国化妆品行业发展趋势洞察-易观分析(附下载)
  5. c语言脸型图案,终于知道自己是什么脸型了,太实用了!
  6. jQuery.prototype的含义。
  7. 最简单的C语言,输出一个“你好,world。”
  8. Java Web图书管理系统毕业设计
  9. Scottrade, Firstrade和Sogotrade之对比--到底哪个好?
  10. 工作站HP电脑系统的重装