一、递归算法的定义

程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

递归,就是在运行的过程中调用自己。
构成递归需具备的条件:

  1. 子问题须与原始问题为同样的事,且更为简单;
  2. 不能无限制地调用本身,须有个出口,化简为非递归状况处理。

递归的套路

  1. 确定递归函数的参数和返回值
  2. 确定终止条件
  3. 确定单层函数的逻辑

二叉树的遍历就是一个典型的递归算法:

代码如下:

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
class Solution {public int countNodes(TreeNode root) {if(root==null) return 0;int left = countNodes(root.left);int right = countNodes(root.right);return left+right+1;}
}

程序自身调用自身是递归的首要特征,递归的本质是穷举法,会遍历所有可能发生的情况,然后选择符合的输出,所以递归的时间效率不理想,所以对于时间要求较严格的情况下,递归可能会超时。

二、回溯算法

回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。许多复杂的,规模较大的问题都可以使用回溯法,有“通用解题方法”的美称。

回溯是递归的副产品,只要有递归就会有回溯。

回溯算法和递归是类似的,只是在递归最后多了一步回退操作,经典的回溯问题:

八皇后问题

n后问题要求在一个n*n格的棋盘上放置n个皇后,使得它们彼此不受攻击。按照国际象棋的规则,一个皇后可以攻击与之处在同一行或同一列或同一条斜线上的其他任何棋子。

分析:利用回溯算法,进行穷举每一种情况,不符合摆放规则的进行回溯。

代码:

public class Main{static int max = 8;static int count = 0;static int[] res = new int[max];public static void main(String[] args) {Main queen = new Main();queen.set(0);System.out.println(count);}//判断当前行是否符合public boolean judge(int n){for(int i=0;i<n;i++)//判断当前行的行(i<n说明行不可能会一样)、列(res[i]==res[n]判断列)、上斜/下斜(Math.abs(i-n)==Math.abs(res[i]-res[n])判断上下斜)是否符合if(res[i]==res[n] || Math.abs(i-n)==Math.abs(res[i]-res[n]))return false;//循环遍历一遍行、列、上下斜都符合,则返回truereturn true;}//设置当前的行public void set(int n){if(n==max)//如果符合n==8了,证明前面的0-7个位置判断是一定正确的,所以可以输出当前结果{out();return;}for(int i=0;i<max;i++){res[n] = i;//逐个试每个位置能否放置if(judge(n)){//如果当前位置可以放置,则set(n+1)放置下一行,如果不可以继续试当前行的下一个位置,当相当于回溯到当前位置,没有进行下一步递归set(n+1);}}}//输出public void out(){count++;//每输出一次就增加一次System.out.println(Arrays.toString(res));}
}

总结,回溯算法是递归的副产品,通常伴随着递归一起出现,需要注意的是,回溯算法在递归结束后会有一次当前行的回溯,也可以说是重置。

递归回溯算法一文读懂详解图文相关推荐

  1. LeetCode回溯算法——51.N皇后问题详解

    51.N皇后 按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子. n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 给你一个整 ...

  2. 什么是递归解析?一文读懂!

    为了更好的控制解析过程,网站管理员常通过设置权威DNS的配置,达到控制解析端.排除不可控用户端的目的.但操作之后往往发现,解析路径中还存在一个影响因子,即本地递归DNS. 递归解析均由各线路的运营商提 ...

  3. 一文读懂电磁学发展史[图文版]

    来源:电子万花筒 电磁学或称电动力学或经典电动力学.之所以称为经典,是因为它不包括现代的量子电动力学的内容.电动力学这样一个术语使用并不是非常严格,有时它也用来指电磁学中去除了静电学.静磁学后剩下的部 ...

  4. 一文读懂NLP之隐马尔科夫模型(HMM)详解加python实现

    一文读懂NLP之隐马尔科夫模型(HMM)详解加python实现 1 隐马尔科夫模型 1.1 HMM解决的问题 1.2 HMM模型的定义 1.2.1HMM的两个假设 1.2.2 HMM模型 1.3 HM ...

  5. 一文读懂——全局注意力机制(global attention)详解与代码实现

    废话不多说,直接先上全局注意力机制的模型结构图. 如何通过Global Attention获得每个单词的上下文向量,从而获得子句向量呢?如下几步: 代码如下所示: x = Embedding(inpu ...

  6. 一文读懂程序化交易算法交易量化投资高频交易统计利

    转 一文读懂程序化交易.算法交易.量化投资.高频交易. 统计套利 在央行发布的<中国金融稳定报告(2016)>中,对于高频交易的解释为程序化交易的频率超过一定程度,就成为高频交易.而对程序 ...

  7. C_一文读懂推荐系统知识体系-上(概念、结构、算法)

    本文主要阐述: 推荐系统的3个W 推荐系统的结构 推荐引擎算法 浏览后四章的内容请见下篇. 1. 推荐系统的3个W 1.1 是什么(What is it?) 推荐系统就是根据用户的历史行为.社交关系. ...

  8. 一文读懂BERT(原理篇)

    一文读懂BERT(原理篇) 2018年的10月11日,Google发布的论文<Pre-training of Deep Bidirectional Transformers for Langua ...

  9. 一文读懂AI简史:当年各国烧钱许下的愿,有些至今仍未实现

    一文读懂AI简史:当年各国烧钱许下的愿,有些至今仍未实现 导读:近日,马云.马化腾.李彦宏等互联网大佬纷纷亮相2018世界人工智能大会,并登台演讲.关于人工智能的现状与未来,他们提出了各自的观点,也引 ...

最新文章

  1. 线性模型已退场,XGBoost时代早已来
  2. 【c语言】模拟库函数strstr
  3. spring 链接池
  4. 全球及中国蔬菜泥配料行业竞争策略及投资潜力研究报告2021-2027年版
  5. Apache Storm 官方文档 —— 源码组织结构
  6. c++强制类型转换运算符
  7. exit与_exit函fork与vfork函数
  8. 商用计算机低温工作,突破量子计算机瓶颈!超低温芯片能在接近绝对零度的温度下工作...
  9. 为SharePoint Services (SPS)设置文件图标
  10. Dubbo(十三)dubbo的负载均衡配置策略
  11. maven依赖下载失败问题
  12. 亚马逊无人超市Amazon Go这次是真的真的开业了
  13. HDOJ--1425 SORT (刚开始学ACM,用的是最简单的方法)
  14. QTTabBar 汉化 给资源管理器添加标签、文件批量重命名依据扩展名选中等功能
  15. ios ipa文件分析
  16. mbp touchbar设置_macbookpro touchbar 怎么添加锁屏快捷键
  17. 2017最新申请苹果开发者账号,申请appstore开发者账号,申请app开发者账号,申请苹果企业公司开发者账号
  18. 目测优衣库董事长只能听到赞扬的声音:3星|《经营者养成笔记》
  19. 全国省市区区划代码以及邮政编码数据最新版--Mysql版(下)
  20. 关于移位密码的破解问题

热门文章

  1. css opacity属性_CSS中的opacity属性
  2. 学编程必须知道的几个社区网站
  3. 关于 Spartacus 新的交付方式 RBSC 和用到的一些工具
  4. 一篇文章讲透yolo v1-v7
  5. 调用淘宝API最简单的例子
  6. 论文阅读笔记(二):Bridging Video-text Retrieval with Multiple Choice Questions
  7. export default 和 export之间的区别
  8. Spring Security Core 5.1.2 源码解析 -- PasswordEncoderFactories
  9. mysql查询单名的语句_MySQL查询语句---单表查询
  10. 程序员的酒后真言,都不容易