递归算法 数据结构_数据结构中递归的定义

递归算法 数据结构_数据结构中递归的定义一、什么是递归所谓递归,简单点来说,就是一个函数直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。引用知乎大佬的例子:我们可以把”递归

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

一、什么是递归

所谓递归,简单点来说,就是一个函数直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。

引用知乎大佬的例子:

我们可以把” 递归 “比喻成 “查字典 “,当你查一个词,发现这个词的解释中某个词仍然不懂,于是你开始查这第二个词。

可惜,第二个词里仍然有不懂的词,于是查第三个词,这样查下去,直到有一个词的解释是你完全能看懂的,那么递归走到了尽头,然后你开始后退,逐个明白之前查过的每一个词,最终,你明白了最开始那个词的意思。

我们把查字典理解成一个函数search(){},而“明白了”就是停止条件。

按这个思路,那这个流程就是这样的:

public void search(){
    //如果明白了就停止函数
    if("明白了"){
       return;
    }
    //没明白调用自己继续查
    search();
}

我们举个简单的例子:

要计算阶乘1*2*3*.....*(n-1)*n,代码如下:

public static int mult(int n) {
    //终止条件,当n=1时直接返回1
    if (n == 1){
        return n;
    }
    //计算n*(n-1).....
    return n * mult(n - 1);
}

二、递归和栈的关系

递归的过程就是出入栈的过程

递归的问题实际上都能拆分成出入栈问题,我们可以举上面计算1*2*3*.....*(n-1)*n这个例子来理解一下:

如果n=4,那么过程就是这样:

  1. mult(4)调用了mult(3)
  2. mult(3)调用了mult(2)
  3. mult(2)调用了mult(1)
  4. 到了mult(1)时满足了终止条件,返回结果

用出入栈的思维理解:

  1. 步骤1-3都是一个入栈过程,mult(4)计算得出结果后入栈,然后运行mult(3)得出结果,然后在入栈……以此类推
  2. 当到达n=1的停止条件时递归停止不再入栈,此时栈深度就是4,这也叫递归深度
  3. 满足停止条件后出栈,mult(1)的结果出栈,与mult(2)的结果出栈相乘,再与随后出栈的mult(3)的结果相乘…..以此类推

递归的本质就是栈的出入过程,所以实际上当深度过深,超过了jvm规定允许的栈最大深度的时候,就会出现栈溢出的问题,也就是java里的StackOverflowError

三、递归的使用条件

那么,我们是时候可以使用递归来解决问题呢:

  • 当问题可以拆分为子问题,并且子问题与原问题解决方法相同
  • 有一个明确的程序停止条件

比如之前的文章中提到连续乘除问题就是一个典型的例子。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/170814.html原文链接:https://javaforall.net

(0)
上一篇 2022年8月16日 下午9:16
下一篇 2022年8月16日 下午9:16


相关推荐

  • pycharm import cv2找不到指定模块_pycharm显示主菜单

    pycharm import cv2找不到指定模块_pycharm显示主菜单首先,我们是要导入opencv(cv2)包,那么这个包是不是必须就在我们这个文件夹下面才行?我认为必须是这样。所以,我们在cmd用pipinstall命令安装,也必须在这个文件夹下执行,并且放到pip.exe一起,我们从opencv官网下好的whl文件也应该放在python/scripts这个里面。在cmd里这样执行,就可以,根据自己的文件夹来,命令仅提供参考:cdC:\Users\YZTang\PycharmProjects\rk-pro\venv\Scriptspipinsta.

    2022年8月27日
    6
  • 安装netbeans步骤

    安装netbeans步骤netbeans 的安装步骤首先 我们要从官网上下载我们需要的 netbeans 安装包下载地址 https netbeans org 下载 NetBeansIDE 进入页面之后 根据你的需求下载我这里选的是 ALL 的下载包 但这里只是安装包较大而已 安装时是可以自定义安装的打开安装包 进入安装页面点击定制 进入自定义安装或者直接进行下一步安装勾选你要安装

    2026年3月10日
    3
  • Python 100道基础入门练习题(附答案)

    Python 100道基础入门练习题(附答案)实例001:数字组合题目有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?程序分析遍历全部可能,把有重复的剃掉。1num=02forainrange(1,5):3forbinrange(1,5):4forcinrange(1,5):5if((a!=b)and(a!=c)and(b!=c)):6print(a,b,c)7nu

    2022年10月2日
    6
  • istat激活码(JetBrains全家桶)2022.01.31

    (istat激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月31日
    269
  • JVM参数解析 Xmx、Xms、Xmn、NewRatio、SurvivorRatio、PermSize、PrintGC「建议收藏」

    -verbose:gc-XX:+printGC可以打印GC的简要信息[GC4790K->374K(15872K),0.0001606secs][GC4790K->374K(15872K),0.0001474secs][GC4790K->374K(15872K),0.0001563secs][GC4790K->374K(15872K),0.0…

    2022年4月16日
    59
  • 启动马达接线实物图_软启动器怎么接线?一张电路图一张实物图供大家参考

    启动马达接线实物图_软启动器怎么接线?一张电路图一张实物图供大家参考朋友们大家好,我是大俵哥,今天我们来聊一下软启动。很多大型动力设备在启动的时候,启动电流都是比较大的,对整个电网有冲击性,所以不能直接启动,具体原因有以下两点。一,有的电机启动电流为额定电流的4--7倍,直接启动会影响同一电网内的其他用电设备。二,直接启动产生较高的峰值转矩,不仅对驱动电机有冲击性,而且易损坏机械装置。软启动相比星三角降压启动、自耦变压器启动等效果要好一些,启动更加平稳,保护也更加…

    2022年6月6日
    296

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号