面向对象【递归方法】

news/2024/12/27 22:50:53/

Java递归方法

文章目录

  • 递归
    • 编写递归函数
    • 递归的工作原理
    • 常见的递归应用场景
    • 递归注意点

递归

递归是一种解决问题的方法,其中一个函数调用自身以解决较小的实例,直到达到基本情况(停止条件),然后开始返回结果。递归可以让我们更容易地解决复杂的问题,因为它允许我们将问题分解成更小的子问题。

在递归中,通常有两个关键要素:

  • 递归调用: 函数在自身内部进行调用。
  • 停止条件: 函数必须有一种方式来结束递归,否则它将无限循环下去。

编写递归函数

public class RecursionExample {public static int factorial(int n) {// 停止条件:当n等于0或1时,阶乘为1。if (n == 0 || n == 1) {return 1;} else {// 递归调用:计算n * (n-1)的阶乘。return n * factorial(n - 1);}}public static void main(String[] args) {int n = 5;int result = factorial(n);System.out.println("Factorial of " + n + " is " + result); // Factorial of 5 is 120}
}
public class RecursionTest {public static void main(String[] args) {RecursionTest test = new RecursionTest();// test.method1(); // 内存溢出System.out.println(test.getSum(100));}/*** 计算1-100之间所有自然数的和*/public int getSum(int n) {if (n == 1) {return 1;} else {return n + getSum(n - 1);}}public void method1() {System.out.println("method1() begin");method1();System.out.println("method1() end");}}

递归的工作原理

当一个递归函数被调用时,它将问题分解成较小的子问题,然后继续调用自身来解决这些子问题。每个子问题都会再次分解,直到达到停止条件。然后,递归函数开始返回结果,将结果合并以解决原始问题。

在递归调用中,每个函数调用都有自己的局部变量和执行上下文,这些信息在递归的不同层次之间传递。

常见的递归应用场景

递归在许多计算机科学和编程问题中都有广泛的应用。以下是一些常见的递归应用场景:

  1. 阶乘计算: 如上所示,计算一个整数的阶乘是一个经典的递归问题。
  2. 斐波那契数列: 斐波那契数列是一个递归问题,其中每个数字是前两个数字的和。
  3. 二叉树遍历: 遍历二叉树(前序、中序、后序)通常使用递归来实现。
  4. 汉诺塔问题: 汉诺塔是一个经典的递归问题,涉及将一堆盘子从一个杆移动到另一个杆,只能使用一个中间杆,且大盘子不能放在小盘子上面。
  5. 组合与排列: 计算组合和排列的问题通常可以使用递归来解决。
  6. 图遍历: 在图数据结构中,深度优先搜索(DFS)和广度优先搜索(BFS)通常使用递归或队列来实现。

递归注意点

  1. 递归调用会占用大量的系统堆栈,内存耗用多,在递归调用层次多
    时速度要比循环慢的多,所以在使用递归时要慎重。
  2. 在要求高性能的情况下尽量避免使用递归,递归调用既花时间又耗
    内存。考虑使用循环迭代

http://www.ppmy.cn/news/1130650.html

相关文章

第一百五十八回 SliverGrid组件

文章目录 概念介绍使用方法示例代码 我们在上一章回中介绍了SliverList组件相关的内容,本章回中将介绍SliverGrid组件.闲话休提,让我们一起Talk Flutter吧。 概念介绍 我们在本章回中介绍的SliverGrid组件是一种网格类组件,主要用来创建网格…

在windows的ubuntu LTS中安装及使用EZ-InSAR进行InSAR数据处理

EZ-InSAR(曾被称为MIESAR,即Matlab界面用于易于使用的合成孔径雷达干涉测量)是一个用MATLAB编写的工具箱,用于通过易于使用的图形用户界面(GUI)进行干涉合成孔径雷达(InSAR)数据处理…

关于 自定义的RabbitMQ的RabbitMessageContainer注解-实现原理

概述 RabbitMessageContainer注解 的主要作用就是 替换掉Configuration配置类中的各种Bean配置; 采用注解的方式可以让我们 固化配置,降低代码编写复杂度、减少配置错误情况的发生,提升编码调试的效率、提高业务的可用性。 为什么说“降低…

Java基础---第七篇

系列文章目录 文章目录 系列文章目录一、final有哪些用法?二、static都有哪些用法?三、3*0.1 == 0.3返回值是什么一、final有哪些用法? final也是很多面试喜欢问的地方,但我觉得这个问题很无聊,通常能回答下以下5点就不错了: 被final修饰的类不可以被继承 被final修饰的方法…

uniapp瀑布流:他的数据是纵向渲染,怎么实现动态上拉加载数据?

不喜勿喷,非常感谢 准备数据:首先,你需要有一些数据,这些数据将会在瀑布流中渲染。你可以将这些数据存储在一个数组中,或者从服务器请求获取。 创建页面:在UniApp中创建一个页面,用于展示纵向…

在EXCEL中构建加载项之创建加载项的目的及规范要求

【分享成果,随喜正能量】一句南无阿弥陀佛,本是释迦牟尼佛所证的无上正等正觉法,洒在娑婆世界的众生海中,只为末世众生能够以信愿之心抓住此救命稻草,要知道今世人此生的处境,可能只剩这道要么极乐要么三涂…

Java自学(三)面向对象编程

目录 什么是面向对象 举例 this关键字和构造器 实体类 电影小案例 什么是面向对象 我们日常生活中谈到一个事物,总会描述它的性质与行为,这个事物也就是 ”对象”。比如一个学生对象,他的属性有姓名、学号、成绩......他的行为有上课、…

【中秋国庆不断更】OpenHarmony定义可动画属性:@AnimatableExtend装饰器

AnimatableExtend装饰器用于自定义可动画的属性方法,在这个属性方法中修改组件不可动画的属性。在动画执行过程时,通过逐帧回调函数修改不可动画属性值,让不可动画属性也能实现动画效果。 可动画属性:如果一个属性方法在animation…