深知自己的算法特别菜,所以想在算法这方面多下工夫
现在被各种专业课支配着,但每天都会抽出一点时间来学习算法 (^ - ^)

相信大家都了解 * 汉诺塔 * 这个问题,我当时学的是云里雾里的(泪目)……

递归

递归简单点说就是自己调用自己,有规律性的调用。

多说无益,直接正题


排列组合

假如我们我abc这三个字符,我们将它所有的组合都列举出来:


a b c
a c b
b a c
b c a
c a b
c b a


细心的朋友会不会发现这样排列的规律呢?

如果没有看出来,那我们将abcd这四个字符列举出来:


abcd
abdc
acbd
acdb
adcb
adbc
bacd
badc
bcad
bcda
bdca
bdac

cbad
cbda
cabd
cadb
cdab
cdba
dbca
dbac
dcba
dcab
dacb
dabc


我们会发现所有的排列组合被分成了四块(这不是故意为之),很明显这样的排列组合是有一定的规律进行排列的。

这四块组合的顺序就是执照 abcd这四个字符进行排序的。


递归思想

我们来分析一下上面的abcd的排列组合,来找出其中的递归思想

  1. 首先,我们发现排列组合以abcd分为四大块。
  2. 其次,我们以a开头的组合情况解析:

abcd
abdc
acbd
acdb
adcb
adbc


我们会发现以a为开头,b,c,d为结尾的组合又分成了三组,它们分别是b,c,d为开头的组合:


bcd
bdc
cbd
cdb

dcb
dbc


而其中,以b为开头的组合,又分成了两组:


cd
dc


而到这里,我们已经不能再分了……

a开头的组合如此,那以bcd开头的那三个组合也是如何。

到这里我想大家应该有了大概的思路了吧
没有也没有关系,因为我们下面来进行代码讲解。


代码详解部分

#include <iostream>
using namespace std;// ch 字符串   k 第一个元素下标       m 最后一个元素的下标
void  permutation(char* ch, int k, int m)
{if(k == m)   // 当我们查找到最后时,则输出{for(int i = 0; i < m; ++i){cout << ch[i];}cout << endl;}else{    permutation(ch, k + 1, m);  // 排列出 a开头的所有组合swap(ch[0], ch[1]);      // 将a与b交换permutation(ch, k + 1, m);    // 排列出 b开头的所有组合swap(ch[0], ch[1]);      // 再次交换回来swap(ch[0], ch[2];     // 将a与c交换permutation(ch, k + 1, m);    // 排列出 c开头的所有组合 swap(ch[0], ch[1]);     // 再次交换回来           }
}int main()
{char ch[] = { "abc" };return 0;
}

我们将这个部分的代码进行整合:

变换成:

for(int i = k; i < m; ++i)
{swap(ch[k], ch[i]);    // 交换位置permutation(ch, k + 1, m);  // 开始递归swap(ch[k], ch[i]);  // 变回来
}

代码解析图:


作者:浪子花梦
Time:2020.2.19
我要向梦一样自由

《算法笔记》—— 解决 排列组合问题 递归的灵活运用相关推荐

  1. 解决排列组合问题的通用算法

    很多网友发贴询问诸如:八皇后问题.彩票问题(从m中数中选择n(m>=n)的组合)等,其实这都可归结为排列组合的问题.解决这类问题,用for循环嵌套是不现实的(只能对指定的m.n编程,而且程序看上 ...

  2. 【亡羊补牢】挑战数据结构与算法 第18期 LeetCode 面试题 08.08. 有重复字符串的排列组合(递归与回溯)

    仰望星空的人,不应该被嘲笑 题目描述 有重复字符串的排列组合.编写一种方法,计算某字符串的所有排列组合. 示例1: 输入:S = "qqe"输出:["eqq", ...

  3. 数学建模 | 用“双射”的思想解决排列组合问题

    ⚠警告:本期极度无聊,非专业人士迅速离开. "双射"(bijective)其实是个比较土味的数学名词,因为在关系代数中我们更喜欢称它为"一一映射".关系代数是研 ...

  4. 小白学算法:DFS排列组合问题

    准备: 一些用语及事项的说明,方便大家理解. 1.数组从一号索引开始用,不用0号索引. 2.dfs递归零次时称为深度1,递归一次称为深度2,以此类推. 3.每个深度dfs要进行一些操作,统称某深度运算 ...

  5. java 穷举 排列组合,JavaScript递归穷举所有排列组合并找出重复值

    null export default { data() { return { resultArr:[] } }, mounted(){ this.sss('aaba','abac'); this.s ...

  6. 字符串所有排列组合暴力递归

    给你一个字符串"acb",可以打印出六种排列组合,这里又是一种index推动的递归,但是这里有一些小trick,就是从第一个开始,在后面的字符串的每一个字符进行交换,这样就可以省很 ...

  7. php 组合算法,PHP简单排列组合算法示例分享

    本文主要和大家介绍了PHP实现的简单排列组合算法,结合具体应用实例分析了排列组合算法的实现与使用技巧,需要的朋友可以参考下,希望能帮助到大家. 一.问题: 给你一个40斤的西瓜,给3个人分,有多少种分 ...

  8. 用DP解决排列组合问题

    高中时学过的排列组合问题,蕴含着一种动态规划的思想,即: 若用二维数组的概念,即: ,但此处若不是简单的组合数,就应该对公式进行修改,根据题意来加一些其他条件. 如例题(印章),python代码如下: ...

  9. 数据结构与算法--字符串的排列组合问题

    字符串的全排列 题目:输入一个字符串,打印出改字符串中所有字符的所有排列.例如输入字符串abc,那么打印出由a,b,c字符组成的所有字符串:abc,acb,bac,bca,cab,cba 如何求解全排 ...

最新文章

  1. 2021HDU多校第一场 zoto(莫队+分块)
  2. python 配置文件对比_Python运维自动化之nginx配置文件对比操作示例
  3. 02027_线程池练习:返回两个数相加的结果
  4. CSP认证201604-2 俄罗斯方块[C++题解]:模拟、枚举
  5. IDEA 点击进入方法内部_【推荐收藏】IDEA的Debug调试,你全会用么?
  6. appium--每次启动会重新安装的问题(没试过)
  7. 学校老师绝对不会教的方法,让你的孩子拥有一个开挂般的人生!
  8. 为什么要使用 Kubernetes 准入控制器
  9. javascript变量声明语法的应用和分号讲究适用性
  10. android 蓝牙sco stream_voice_call,android TTS输出总是要 A2DP_android_开发99编程知识库
  11. jest.conf.js_如何在Jest中正确模拟Moment.js / dates
  12. 【equals与==比较】String的两种拼接
  13. python怎么创建变量_创建一个新变量,它是python中另一个变量的...
  14. GTD+敏捷=一种新的计划列表理念和方法。
  15. Datalogic得利捷推出最新读码产品及终端应用,全面提升企业工业制造生产力
  16. 华为od德科面试数据算法真题解析-专栏必看-
  17. 三星S8相机黑画面解决
  18. 五一影视圈的神仙打架,揭开了内容市场暗自角力的真相
  19. linux模糊查找子目录,Linux运维知识之linux中模糊查找文件
  20. 4W家庭理财常见问题及解决方法

热门文章

  1. YNB/酵母氮源基础 (含硫酸铵,不含氨基酸)的基本信息(供应SD/-Ade/-His/-Leu/-Met-Trp/-Ura with Agar/SD/-Cys/-Met/Ura with Agar)
  2. 美团如何基于深度学习实现图像的智能审核?
  3. 中奖名单 | 蓝色星球的“小天使”是……
  4. 站在一哥们巨人肩膀上,开发完善了闲鱼上新监测软件
  5. centos配置ADSL拨号 配置阿里云的yum源
  6. centos架设FTP服务器
  7. 8uftp不能用,无法读取目录
  8. 打破偏见,从花西子发现的新消费品牌真相
  9. linux PCI设备驱动
  10. 牛客IOI周赛22-普及组