递归算法(英语:recursion algorithm)在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法。递归式方法可以被用于解决很多的计算机科学问题,因此它是计算机科学中十分重要的一个概念。绝大多数编程语言支持函数的自调用,在这些语言中函数可以通过调用自身来进行递归。计算理论可以证明递归的作用可以完全取代循环,因此在很多函数编程语言(如Scheme)中习惯用递归来实现循环。

​递归形式的应用范围是非常广泛的,我们常说的深度优先搜索DFS算法就是用递归形式实现的,本文仅介绍涉及枚举的递归,它们也可以归类到DFS算法。

枚举算法是我们在日常中使用到较多的一种算法,它的核心思想就是:枚举所有的可能。枚举法的本质就是从所有候选答案中去搜索正确的解,使用该算法需要满足两个条件:(1)可预先确定候选答案的数量;(2)候选答案的范围在求解之前必须有一个确定的集合。

最简单的枚举问题:答案是单一信息(比如答案是一个数字),此时只需使用循环即可枚举所有答案,例如找到小于N的最大质数,找到数组中的最大值......

也有一些问题,答案是一个序列或排列,此时就无法用循环来解决问题。可以用递归的方式找到子序列、组合、或者排列,然后对答案进行筛选。比如经典的“N皇后问题”,其答案是一个N的全排列,而背包问题(选择不超过背包容量的最大价值物品),其最终答案是一个子序列。需要注意的是,递归枚举的时间复杂度极高,因此只适用于n比较小的情况,或者是实在想不出来正确解法时用来获得基础分数(骗分)。

本文介绍子序列、组合、全排列的递归写法。

基础递归思想如下(以组合为例):F(n个数字,取m个),根据第一个数字选中还是不选中,可以分解为F(n-1个数字,取m-1个)+ F(n-1个数字,取m个)。在代码实现过程中,需要设计(1)设定参数确定选取范围和已选取个数,(2)如何存储答案和避免重复选取。在遇到具体问题时,还要考虑在算法中加入限定语句减少递归次数(剪枝)或做进一步的优化。

(一)递归实现指数型枚举(子序列)

(二)递归实现组合枚举(组合)

(三)递归实现排列枚举(排列)

递归算法实现指数型枚举、组合、排列相关推荐

  1. 递归实现【指数型 / 组合型 / 排列型】枚举

    92. 递归实现指数型枚举 #include<bits/stdc++.h> using namespace std; const int N=20; int a[N],n; void df ...

  2. 模版 ----- 一维指数型枚举 排列型枚举 组合型枚举

    文章目录 一维指数型枚举 一.01型枚举 应用场景 递归树模型 时间复杂度 代码模版 应用 二.滑动型枚举 应用场景 递归树模型 时间复杂度 代码模版 排列型枚举 应用场景 递归树模型 时间复杂度分析 ...

  3. [位运算][递归] 递归实现指数型枚举

    递归实现指数型枚举 从 1~n 这 n 个整数中随机选取任意多个,输出所有可能的选择方案. 输入格式 输入一个整数n. 输出格式 每行输出一种方案. 同一行内的数必须升序排列,相邻两个数用恰好1个空格 ...

  4. 【组合数学】排列组合 ( 排列组合示例 )

    文章目录 一.排列组合示例 1 ( 组合 | 乘法法则 | 加法法则 ) 二.排列组合示例 2 参考博客 : [组合数学]基本计数原则 ( 加法原则 | 乘法原则 ) [组合数学]集合的排列组合问题示 ...

  5. 排列组合思维导图_排列组合——排列数专题

    在上篇关于排列组合主要考点的介绍中,正男老师提到:排列组合考点通常可以拆分为排列数考点和组合数考点.排列数考点相关试题可以细分为2类,分别为:穷举问题和限制条件问题.本期正男老师就从近六年内的5道涉及 ...

  6. 小技巧 ----- 通过二进制串的位运算进行二维指数型枚举

    二维指数型枚举 题目: 给定4x4矩阵(每个元素为1或0) 枚举出所有情况,在矩阵元素为1的位置执行turn()方法 思路: 把4x4方格看作一个一维的水平长度为16的方格 即现在需要枚举一个长度为1 ...

  7. AcWing 95. 费解的开关(指数型枚举)

    95. 费解的开关 题意: 给定一个5x5的方格,共25盏灯 每盏灯有开和关两种状态 每次操作一盏灯时,以该灯为中心的十字形状范围的灯都会改变状态 找到用最少的操作步数使所有的灯都亮着,当步数超过6时 ...

  8. 小技巧 ----- 通过二进制串的位运算进行一维指数型枚举

    一维指数型枚举 使用场景 给定n个水平方格 每个方格里面可以放1或0 那么所有存放的情况一共有2n2^n2n种 枚举出所有情况 二进制串的位运算结论 给定一个二进制串,如101011 从左到右可以规定 ...

  9. 19071 递归实现指数型枚举

    Description 递归实现指数型枚举是一种常用的DFS算法,复杂度是2^n,只能在n比较小的时候使用. 一般用于:从 1∼n 这 n 个整数中随机选取(或者有某些规则限制)任意多个,输出所有可能 ...

最新文章

  1. Unity iOS打开AppStore评星页面,浅谈Application.OpenURL()方法。
  2. IHttpModule和IHttpHandler 应用笔记
  3. java bytebuffer 大小,bytebuffer 获取长度
  4. android 语音自动播报,Android 语音播报实现
  5. android progressbar 不显示_Android多线程技术选型最全指南(1)
  6. 从Sql server 2000 到 Oracle 10g数据库迁移数据类型转化
  7. C++中的运算符优先级
  8. 浅谈Spring框架注解的用法分析
  9. 随笔 - Andriod
  10. 为caffe添加最简单的全通层AllPassLayer
  11. Mysql 基础知识
  12. IE6下绝对定位层不显示
  13. 这个方法可以实现自动抠图,快来get
  14. linux进程阻塞例子,linux阻塞与非阻塞驱动例子
  15. linux下关闭acpi电源管理模块
  16. 移动MM 支付SDK遇到的问题
  17. 苹果手机性能测试用是么软件,怎么检测iPhone手机性能
  18. 国产linux凝思4.2系统多网卡指定路由配置
  19. idea 项目能运行,但是代码冒红-解决措施
  20. Spring Cloud Zuul API 网关服务

热门文章

  1. python汉诺塔的求解_Python汉诺塔算法解析
  2. Java 面试必考题:动态代理
  3. HighCharts HelloWorld
  4. 绘画系统(06):【类】QPaintPath[官翻]
  5. 联合书单 | 6本书,李诞带你感受数学之美
  6. 解决selenium打开浏览器不是全屏的问题
  7. (2022版)一套教程搞定k8s安装到实战 | Docker基本命令
  8. 第一周CoreIDRAW课总结
  9. android关于UI的渲染速度
  10. OpenGL:基本图形绘画