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

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

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • shell循环执行脚本[通俗易懂]

    shell循环执行脚本[通俗易懂]shell循环执行脚本2017年08月24日15:28:18阅读数:215foriin{1..10} do   echo"Welcome$itimes"   eoo$i.sh done

    2022年7月24日
    8
  • 静态代码检查报告

    静态代码检查报告今天在下面刊载一篇小王同学写的静态代码检查报告 图文并茂 条理清晰 1 工具说明 FindBugs 是一个静态分析工具 它检查类或者 JAR 文件 将字节码与一组缺陷模式进行对比以发现可能的问题 有了静态分析工具 就可以在不实际运行程序的情况对软件进行分析 不是通过分析类文件的形式或结构来确定程序的意图 而是通常使用 Visitor 模式 Findbugs 可以

    2025年11月16日
    3
  • native ascii_编码转换在线

    native ascii_编码转换在线1、获取native2ascii:安装了jdk后,假如你是在windows上安装,那么在jdk的安装目录下,会有一个bin目录,其中native2ascii.exe正是。2、native2ascii的命令行的命名格式:native2ascii-[options][inputfile[outputfile]]说明:-[options]:表示命令开关,有两个选项可供选择-r…

    2025年10月31日
    2
  • vs生成sln文件_VS二进制文件

    vs生成sln文件_VS二进制文件VisualStudio.NET采用两种文件类型(.sln和.suo)来存储特定于解决方案的设置,它们总称为解决方案文件。为解决方案资源管理器提供显示管理文件的图形接口所需的信息,从而在每次继续开发任务时,不会因开发环境而分散精力;*.sln:(VisualStudio.Solution)通过为环境提供对项目、项目项和解决方案项在磁盘上位置的引用,可将它们组织到解决方案…

    2022年5月3日
    591
  • build.gradle报错(eclipse编译不了项目)

    笔者是通过idea编译spring5源代码,该项目基于gradle构建,编译过程中具体报错如下:2020-03-1610:38:26,134[663812]INFO-.project.GradleProjectResolver-Gradleprojectresolveerrororg.gradle.tooling.GradleConnectionException:…

    2022年4月11日
    285
  • OkGo详解

    OkGo详解一 什么是 OkGoOkGo 基于 okhhttp 的封装类 你会发现他真的比 okhttp 简单的多 一个专注于让网络请求更简单的框架 与 RxJava 完美结合 比 Retrofit 更简单易用 二 主要功能 1 基本的 get post put delete head options trace patch 八种请求 2 支持 upString upJson upBytes upFile 等 up 类方法上传特定数据 3 支持一个 key 上传一个文件 也可以一个 key 上传多个文件 也

    2025年8月4日
    3

发表回复

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

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