【小白学算法】10.递归的调用机制、使用时要注意的规则

简介: 【小白学算法】10.递归的调用机制、使用时要注意的规则

简单来说,递归就是自己调用自己,在每次调用时传入不同的变量。递归有助于解决复杂的问题,同时让代码变得简洁。


在之前的文章中,对递归有过简单的介绍,现在进一步了解下递归的调用机制。


一、递归的调用机制


先上一段简单的递归调用的代码:


package recursion;
public class RecursionTest {
    public static void main(String[] args) {
        test(4);
    }
    public static void test(int n) {
        if (n > 2) {
            test(n - 1);
        }
        System.out.println("n=" + n);
    }
}


可以看到,在main方法里,执行test(4),当满足n>2的条件时,test()会继续调用test(),直到不满足递归条件,打印出n的值。


运行结果其实也很容易想到:


n=2
n=3
n=4
Process finished with exit code 0


运行结果倒不是重点了,现在借着这段代码再加张图,看下递归的调用机制。


1268169-20210422233518520-2118658970.png


图中所示就是在执行代码的过程中,jvm中发生的一些事情。不过这里声明一下,关于jvm的某些描述可能并不是很准确,这里只是辅助理解记忆。


  1. 首先,在运行main方法时,会在栈里开辟一个main方法的栈帧。

当main方法里调用test方法时,又会压入一个栈帧,也就是入栈。当方法没运行结束时,是不会出栈的。

所以,运行test(4),会继续压入一个栈帧(红色箭头)。


  1. test(4)里,经过判断会继续调用test(3),于是继续压入一个栈帧。


  1. test(3)里,经过判断会继续调用test(2),于是继续压入一个栈帧。


  1. test(2)里,经过判断,不再递归,于是运行了print代码,打印出n的值为2。
    方法运行完了就会出栈(黄色箭头),回到test(3)


  1. test(3)打印出n的值为3,继续出栈,回到test(4)


  1. test(4)打印出n的值为4,main方法运行结束,退出程序。

所以,代码运行的结果就是2,3,4


二、使用递归需要知道的点


  1. 执行一个方法时,会创建一个新的受保护的独立空间。比如上面的栈帧。


  1. 方法的局部变量是独立的,不会相互影响。比如上面每次递归时候的变量n
    但是,如果方法中使用的是引用类型变量,那会共享该引用类型。比如,引用一个数组。


  1. 重点:递归必须向退出递归的条件逼近,否则就无限递归,最终栈溢出StackOverflowError


  1. 当方法执行完毕,或者遇到return,就会返回。遵守谁调用,就将结果返回给谁。
    比如上图中最上面的栈帧test(2)运行结束后,就返回到调用它的test(3)
相关文章
|
2月前
|
算法 C++
算法笔记:递归(c++实现)
算法笔记:递归(c++实现)
|
2月前
|
存储 算法 程序员
数据结构与算法===递归
数据结构与算法===递归
|
6天前
|
算法
【算法】递归、搜索与回溯——汉诺塔
【算法】递归、搜索与回溯——汉诺塔
|
13天前
|
数据可视化 算法 前端开发
基于python flask+pyecharts实现的中药数据可视化大屏,实现基于Apriori算法的药品功效关系的关联规则
本文介绍了一个基于Python Flask和Pyecharts实现的中药数据可视化大屏,该系统应用Apriori算法挖掘中药药材与功效之间的关联规则,为中医药学研究提供了数据支持和可视化分析工具。
|
6天前
|
算法
【算法】递归总结:循环与递归的区别?递归与深搜的关系?
【算法】递归总结:循环与递归的区别?递归与深搜的关系?
|
6天前
|
算法
【算法】递归、搜索与回溯——简介
【算法】递归、搜索与回溯——简介
|
1月前
|
算法 Python
python中算法递归错误(Recursion Errors)
【7月更文挑战第18天】
25 1
|
2月前
|
机器学习/深度学习 算法 C语言
详细介绍递归算法在 C 语言中的应用,包括递归的基本概念、特点、实现方法以及实际应用案例
【6月更文挑战第15天】递归算法在C语言中是强大力量的体现,通过函数调用自身解决复杂问题。递归涉及基本概念如自调用、终止条件及栈空间管理。在C中实现递归需定义递归函数,分解问题并设定停止条件。阶乘和斐波那契数列是经典应用示例,展示了递归的优雅与效率。然而,递归可能导致栈溢出,需注意优化。学习递归深化了对“分而治之”策略的理解。**
46 7
|
1月前
|
数据采集 机器学习/深度学习 算法
Python基于Apriori关联规则算法实现商品零售购物篮分析
Python基于Apriori关联规则算法实现商品零售购物篮分析
|
2月前
|
算法 前端开发 Java
探讨Java中递归构建树形结构的算法
探讨Java中递归构建树形结构的算法
24 1

热门文章

最新文章