Java递归详解_java难不难学

Java递归详解_java难不难学学习目标:提示:这里可以添加学习目标例如:一周掌握Java入门知识学习内容:提示:这里可以添加要学的内容例如:1、搭建Java开发环境2、掌握Java基本语法3、掌握条件语句4、掌握循环语句学习时间:提示:这里可以添加计划学习的时间例如:1、周一至周五晚上7点—晚上9点2、周六上午9点-上午11点3、周日下午3点-下午6点学习产出:提示:这里统计学习计划的总量例如:1、技术笔记2遍2、CSDN技术博客3篇

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

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

Java递归详解


前言

递归是一种非常重要的算法思想,无论你是前端开发,还是后端开发,都需要掌握它。在日常工作中,统计文件夹大小,解析xml文件等等,都需要用到递归算法。它太基础太重要了,这也是为什么面试的时候,面试官经常让我们手写递归算法。本文呢,将跟大家一起学习递归算法~

什么是递归?

递归,在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法。简单来说,递归表现为函数调用函数本身。

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

看一个递归的代码例子吧,如下:

public int sum(int n) { 
   
    if (n <= 1) { 
   
        return 1;
    } 
    return sum(n - 1) + n; 
}

递归的特点

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

终止条件:递归必须有一个终止的条件,即不能无限循环地调用本身。

自身调用:原问题可以分解为子问题,子问题和原问题的求解方法是一致的,即都是调用自身的同一个函数。
在这里插入图片描述

递归应用场景

哪些问题我们可以考虑使用递归来解决呢?即递归的应用场景一般有哪些呢?

  • 阶乘问题
  • 二叉树深度
  • 汉诺塔问题
  • 斐波那契数列
  • 快速排序、归并排序(分治算法体现递归)
  • 遍历文件,解析xml文件

递归解题思路

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

第一步,定义函数功能
第二步,寻找递归终止条件
第二步,递推函数的等价关系式
这个递归解题三板斧理解起来有点抽象,我们就用阶乘(factorial)来举个例子吧

1.定义函数功能

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

//n的阶乘(n为大于0的自然数)
int factorial (int n){ 
   

}

2.寻找递归终止条件

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

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

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

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

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

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

(0)
上一篇 2026年1月20日 上午9:43
下一篇 2026年1月20日 上午10:15


相关推荐

  • 微信Linux版本

    微信Linux版本git 托管地址 https github com geeeeeeeeek electronic wechat releases1 下载选择版本 点击下载 2 解压 nbsp nbsp tarzxvflinux x64 tar gz 3 运行 cd 到文件目录 nbsp nbsp nbsp electronic wechat4 就可以正常使用了

    2026年3月20日
    2
  • CSS中如何去掉li标签前面的小圆点

    CSS中如何去掉li标签前面的小圆点CSS 去掉 li 标签前面的小圆点 ulli 代码示例 ul li 西瓜 li li 冬瓜 li li 南瓜 li li 北瓜 li ul 运行示例图 我们可以清楚地看到每个 li 前边都有一个小圆点如何利用 css 去除小圆点只需一行代码 list style none

    2026年3月19日
    2
  • 23岁的一无所有,其实是理所应当的「建议收藏」

    23岁的一无所有,其实是理所应当的「建议收藏」23岁那年你正处在哪个状态?现在呢? 我,23岁,应届毕业生。生活,工作,爱情都处于人生的低谷,一穷二白,一无所有,一事无成。分享一下成长的建议吧。匿名用户23岁那年…就是去年…… 在22岁的时候我毕业,同时第二年准备考研,结果因为压力太大,期望太高,又失利了,但是我依然满怀信心和憧憬 在我23岁那年四月,当我深爱的女孩(在这之前我追了她四年)说她要去北京时,我在毫无准备的情况下,…

    2022年7月25日
    12
  • DotNetBar 学习笔记

    DotNetBar 学习笔记将 DotNetBarMan 控件放入窗体中 右击可以创建菜单栏 工具栏等 1 如何设置菜单栏中的 分隔线 选定一个菜单 设置 BeginGroup 属性为 True 2 如何设置菜单前的图标 修改 Image 属性 3 日期选择用 dateTimeInpu 中文格式 Format 属性设为 Long 4 单选钮用 checkBoxX CheckBoxStyl 属性设为 Radi

    2026年3月17日
    2
  • C++中protected访问权限问题

    C++中protected访问权限问题今天发现有这样两句话 1 基类的保护成员对于派生类的成员是可访问的 2 派生类的成员只能通过派生类对象访问基类的保护成员 派生类对一个基类对象中的受保护成员没有访问权限 这两句话看的太头晕了 其实作者应该是想表达 只有在派生类中才可以通过派生类对象访问基类的 protected 成员 看这样的代码 classBase public Base private

    2026年3月18日
    2
  • javabean是什么?

    javabean是什么?一 javabean 是什么 JavaBean 是指一段特殊的 Java 类 就是有默然构造方法 只有 get set 的方法的 java 类的对象 nbsp nbsp 专业点解释是 JavaBean 定义了一组规则 JavaBean 就是遵循此规则的平常的 Java 对象 nbsp nbsp 满足这三个条件 nbsp nbsp 1 执行 java io Serializable 接口 2 提供无参数的构造器 nbsp 3

    2026年3月16日
    2

发表回复

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

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