什么是递归:

简单地说,就是如果在函数中存在着调用函数本身的情况,这种现象就叫递归。(简单的说就是函数自己调用自己) 进一步剖析「递归」,先有「递」再有「归」,「递」的意思是将问题拆解成子问题来解决, 子问题再拆解成子子问题,...,直到被拆解的子问题无需再拆分成更细的子问题(即可以求解),「归」是说最小的子问题解决了,那么它的上一层子问题也就解决了,上一层的子问题解决了,上上层子问题自然也就解决了,....,直到最开始的问题解决。

递归最恰当的比喻,就是查词典。我们使用的词典,本身就是递归,为了解释一个词,需要使用更多的词。当你查一个词,发现这个词的解释中某个词仍然不懂,于是你开始查这第二个词,可惜,第二个词里仍然有不懂的词,于是查第三个词,这样查下去,直到有一个词的解释是你完全能看懂的,那么递归走到了尽头,然后你开始后退,逐个明白之前查过的每一个词,最终,你明白了最开始那个词的意思。

递归的特点:

实际上,递归有两个显著的特征,终止条件和自身调用

1.终止条件:递归必须有一个终止的条件,即不能无限循环地调用本身(会造成栈内存溢出)。

2..自身调用:原问题可以分解为子问题,子问题和原问题的求解方法是一致的,即都是调用自身的同一个函数。

递归解题思路:

解决递归问题一般就三步曲,分别是:

  • 第一步,定义函数功能
  • 第二步,寻找递归终止条件
  • 第三步,递推函数的等价关系

这个递归解题三板斧理解起来有点抽象,我们拿阶乘递归例子来喵喵吧~

1.定义函数功能

定义函数功能,就是说,你这个函数是干嘛的,做什么事情,换句话说,你要知道递归原问题是什么呀?比如你需要解决阶乘问题,定义的函数功能就是n的阶乘,如下:

//n的阶乘(n为大于0的自然数)public static int getFactorial(int num) {}

2.寻找递归终止条件

递归的一个典型特征就是必须有一个终止的条件,即不能无限循环地调用本身。所以,用递归思路去解决问题的时候,就需要寻找递归终止条件是什么。比如阶乘问题,当n=1的时候,不用再往下递归了,可以跳出循环啦,n=1就可以作为递归的终止条件,如下:

//n的阶乘(n为大于0的自然数)
public static int getFactorial(int num) {if (num == 1){return 1;}
}

3.递推函数的等价关系式

递归的本义,就是原问题可以拆为同类且更容易解决的子问题,即原问题和子问题都可以用同一个函数关系表示。递推函数的等价关系式,这个步骤就等价于寻找原问题与子问题的关系,如何用一个公式把这个函数表达清楚。阶乘的公式就可以表示为 f(n) = n * f(n-1), 因此,阶乘的递归代码就可以写成这样,如下:

public static int getFactorial(int num) {if (num == 1) {return 1;}return num * getFactorial(num - 1);}

完整代码如下:

public class 递归算法 {public static void main(String[] args) {int factorial = getFactorial(5);System.out.println(factorial);}public static int getFactorial(int num) {if (num == 1) {return 1;}return num * getFactorial(num - 1);}
}

Java 递归算法详解相关推荐

  1. Apache Thrift - java开发详解

    2019独角兽企业重金招聘Python工程师标准>>> Apache Thrift - java开发详解 博客分类: java 架构 中间件 1.添加依赖 jar <depen ...

  2. Java泛型详解-史上讲解最详细的,没有之一

    目录 1. 概述 2. 一个栗子 3. 特性 4. 泛型的使用 4.1 泛型类 4.2 泛型接口 4.3 泛型通配符 4.4 泛型方法 4.4.1 泛型方法的基本用法 4.4.2 类中的泛型方法 4. ...

  3. Java虚拟机详解----JVM常见问题总结

    [正文] 声明:本文只是做一个总结,有关jvm的详细知识可以参考本人之前的系列文章,尤其是那篇:Java虚拟机详解04----GC算法和种类.那篇文章和本文是面试时的重点. 面试必问关键词:JVM垃圾 ...

  4. java 泛型详解、Java中的泛型方法、 java泛型详解

    本文参考java 泛型详解.Java中的泛型方法. java泛型详解 概述 泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用. 什么是泛型?为什么要使用泛型? 泛型,即& ...

  5. 最详细的java泛型详解

    来源:最详细的java泛型详解 对java的泛型特性的了解仅限于表面的浅浅一层,直到在学习设计模式时发现有不了解的用法,才想起详细的记录一下. 本文参考java 泛型详解.Java中的泛型方法. ja ...

  6. Java异常详解及如何处理

    来源:Java异常详解及如何处理 简介 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常.异常发生时,是任程序自生自灭,立刻退出终止,还是输出错误给用户?或者用C语言 ...

  7. php详解递归,PHP递归算法详解

    本篇文章主要介绍PHP递归算法详解,感兴趣的朋友参考下,希望对大家有所帮助. 遇到需要设计树节点的数据库结构,以及需要读出来的树节点数据结构!大家是否会选择用数据库的查询方式来获取树结构呢?//曾经的 ...

  8. Java基础——Java NIO详解(一)

    一.基本概念 1.I/0简介 I/O即输入输出,是计算机与外界世界的一个借口.IO操作的实际主题是操作系统.在java编程中,一般使用流的方式来处理IO,所有的IO都被视作是单个字节的移动,通过str ...

  9. Java基础——Java NIO详解(二)

    一.简介 在我的上一篇文章Java NIO详解(一)中介绍了关于标准输入输出NIO相关知识, 本篇将重点介绍基于网络编程NIO(异步IO). 二.异步IO 异步 I/O 是一种没有阻塞地读写数据的方法 ...

最新文章

  1. 架构师之路 — 软件架构 — 架构软件的过程
  2. Python中浅拷贝与深拷贝的骚操作
  3. Lintcode99 Reorder List solution 题解
  4. git的常用的使用方法
  5. js获取jsp上下文地址
  6. mysql 分区表 限制_Mysql分区表使用的一些限制和需要注意的地方-阿里云开发者社区...
  7. access 知乎 窗体_ACCESS数据可视化之路
  8. CRC算法(直接计算法和查表法)
  9. Typora下载安装教程
  10. Windows 下载安装 Seata
  11. WordPress首页上设置倒计时
  12. 生物信息学笔记03 -- 基因组序列分析 方法
  13. 在项目中怎样写故障树或者类层次
  14. React系列之生命周期
  15. c++虚指针及相应对象的数据结构
  16. div box盒子的一些概念
  17. 五分钟掌握计时器CountDownTimer,快速实现倒计时功能
  18. java 为什么双亲委派_双亲委派机制及使用原因是什么?
  19. freemarker生成word,表格分页
  20. MATLAB中不用循环生成圆盘(圆形)/圆环掩膜矩阵

热门文章

  1. 真正免费的PDF合并软件,不用下载,在线一键合并
  2. 用户运营中,数据分析给与企业的三个精准帮助
  3. Python项目打包部署Linux服务上
  4. Live2D Web端实现
  5. 使用keras.applications和keras_applications构建keras.Model
  6. 暴力破解zip压缩包
  7. 有密码的压缩包如何解压
  8. 计算机在职研究生学什么专业好就业工资高,在职读研选择哪些专业好就业?
  9. 汇编语言环境准备-《汇编语言-王爽老师》
  10. 云终端计算机系统,云终端是什么?