递归函数:以层次来想函数递归,以深度来想递归出口。

问题:
给出一个集合,输入这个集合所有的排列集合。
例如:
输入:
{1,2,3}
输出:
{1,2,3}
{1,3,2}
{2,1,3}
{2,3,1}
{3,1,2}
{3,2,1}
思路:
全排列,就是不断交换两个元素,打印。
将所有可以交换的两个元素都交换一遍,都打印一遍,加上本来的排列,打印出来的就是我们的全排列。
所以我们焦点就放在了交换上面,怎么交换两个元素会使逻辑清晰。我们自己手写全排列的时候,一般都是先以第一个元素为首的全排列写完,再以第二个元素为首的全排列写完…直至写完。
我们先确定1这个位置不动,对剩下的数进行全排列,剩下的数的全排列第一个数加上1,那么以1为首的全排列就结束了。那么怎么对剩下的全排列进行排序呢?剩下的元素中,第一个元素不动,对剩下的元素进行全排列…一直递归,那么递归出口就是我们递归到最后一个元素,不需要对最后一个元素进行全排列。
看着代码分析会清晰一点:

void Perm(int* arr, int k, int m)
{if (k == m - 1){for (int i = 0; i < m; i++){printf("%2d", arr[k]);}}else{for (int i = k; i < m; i++){swap(arr[i], arr[k]);Perm(arr, k + 1, m);swap(arr[i], arr[k]);}}
}

我们以层次来分析这个代码,首先将第一个元素和第一个元素本身进行交换,再将第一个元素本身和第二个元素交换,第一个元素和第三个元素交换…直至第一个元素和最后一个元素进行完交换。
第一层:产生【1,2,3】 【2,1,3】 【3,2,1】三个数组。下一层递归,会对数组的除去第一个元素的剩下元素进行交换。剩下元素的第一个元素和第一个元素交换,剩下元素的第一个元素和第二个元素交换,剩下元素的第一个元素和第三个元素交换…

递归函数我们按层次分析,出来的就会是一个树,在这里我们相当于在叶子节点时,打印数组的值。

递归与分治——全排列问题相关推荐

  1. 算法设计与分析——递归与分治策略——全排列

    算法设计与分析--递归与分治策略--全排列 全排列问题的解决是通过分治与递归思想来解决的 首先判断是否递归到了最后一位,如果递归到了最后一位,则输出他当前的全排列序列. 如果没有到达最后一位,则循环的 ...

  2. 算法设计与分析第2章 递归与分治策略

    第2章 递归与分治策略 2.1 递归算法 递归算法:直接或间接地调用自身的算法. 递归函数:用函数自身给出定义的函数.两个要素:边界条件.递归方程 优点:结构清晰,可读性强,而且容易用数学归纳法来证明 ...

  3. c语言分治法求众数重数_五大常见算法策略之——递归与分治策略

    递归与分治策略 递归与分治策略是五大常见算法策略之一,分治策略的思想就是 分而治之 ,即先将一个规模较大的大问题分解成若干个规模较小的小问题,再对这些小问题进行解决,得到的解,在将其组合起来得到最终的 ...

  4. DSt:数据结构的最强学习路线之数据结构知识讲解与刷题平台、刷题集合、问题为导向的十大类刷题算法(数组和字符串、栈和队列、二叉树、堆实现、图、哈希表、排序和搜索、动态规划/回溯法/递归/贪心/分治)总

    DSt:数据结构的最强学习路线之数据结构知识讲解与刷题平台.刷题集合.问题为导向的十大类刷题算法(数组和字符串.栈和队列.二叉树.堆实现.图.哈希表.排序和搜索.动态规划/回溯法/递归/贪心/分治)总 ...

  5. 【算法设计与分析】递归与分治 | 复习笔记

    文章目录 算法总体思想 递归的概念 定义 n的阶乘 Fibonacci数列 Ackerman函数 排列问题 整数划分问题 Hanoi塔问题 递归小结 分治法的适用条件 分治法的基本步骤 分治法的复杂性 ...

  6. 分治法一个整数数列求最大值最小值_五大常见算法策略之丨递归与分治策略

    递归与分治策略 递归与分治策略是五大常见算法策略之一,分治策略的思想就是分而治之,即先将一个规模较大的大问题分解成若干个规模较小的小问题,再对这些小问题进行解决,得到的解,在将其组合起来得到最终的解. ...

  7. 从0开始学递归和分治

    本文在写作过程中参考了大量资料,不能一一列举,还请见谅. 递归的定义: 程序调用自身的编程技巧称为递归.递归做为一种算法在程序设计语言中广泛应用. 一个过程或函数在其定义或说明中有直接或间接调用自身的 ...

  8. 从零开始学递归与分治

    本文在写作过程中参考了大量资料,不能一一列举,还请见谅. 递归的定义: 程序调用自身的编程技巧称为递归.递归做为一种算法在程序设计语言中广泛应用. 一个过程或函数在其定义或说明中有直接或间接调用自身的 ...

  9. ​相似算法比较:递归、分治、动态规划、贪心、回溯、分支限界​

    相似算法比较:递归.分治.动态规划.贪心.回溯.分支限界 ​ 在学习算法的过程中,递归.分治.动态规划.贪心.回溯.分支限界这些算法有些类似,都是为了解决大问题,都是把大问题拆分成小问题来解决,但她们 ...

最新文章

  1. R语言实战应用精讲50篇(十三)-如何使用JAVA调用R语言,两种语言的完美结合
  2. Android数据库高手秘籍(二):创建表和LitePal的基本用法
  3. python dict update保持顺序_Python OrderedDict不保持元素顺序 - python
  4. SAP UI5 bindProperty
  5. python中常用的方法
  6. Monkey测试执行指导
  7. 报错,> 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL
  8. innodb 共享表空间 转 独立表空间 详细说明
  9. 大数据小视角1:从行存储到RCFile
  10. Airmail 5 for Mac(轻量级邮件客户端)
  11. 2015职称计算机考试模拟,2015职称计算机考试《Dreamweaver》模拟试题(9)
  12. 【评测】NHEK细胞(正常成人表皮角质形成层细胞)
  13. 关于C++中的随机数生成器
  14. Python转换音频采样率(8k到16k)
  15. 当RPM包安装遇上“依赖性”问题时的解决办法
  16. 性能测试监控TP50、TP99、TP999含义(99分位延时的含义)
  17. 详解pandas的read_csv方法
  18. Rest_Assured接口测试学习汇总
  19. 阅读《精通Python爬虫框架Scrapy》
  20. DSP学习总结——Boot引导模式

热门文章

  1. 实用的SqlHelper类
  2. [基础题] 3、设计一个交通工具抽象类,提供抽象方法--驾驶
  3. java 是否继续操作?代码
  4. PHP-代码审计-代码执行
  5. 《每日一题》290. Word Pattern
  6. Makefile 学习 1
  7. 【机器视觉】 dev_set_line_width算子
  8. 【机器视觉】 dev_get_system算子
  9. 【Linux】一步一步学Linux——apt-get命令(278)
  10. 【Linux】一步一步学Linux——ipcalc命令(191)