【小白学算法】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月前
|
算法 Python
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果;贪心算法在每一步选择局部最优解,追求全局最优;动态规划通过保存子问题的解,避免重复计算,确保全局最优。这三种算法各具特色,适用于不同类型的问题,合理选择能显著提升编程效率。
65 2
|
3月前
|
算法 搜索推荐 Shell
数据结构与算法学习十二:希尔排序、快速排序(递归、好理解)、归并排序(递归、难理解)
这篇文章介绍了希尔排序、快速排序和归并排序三种排序算法的基本概念、实现思路、代码实现及其测试结果。
47 1
|
7月前
|
存储 算法 程序员
数据结构与算法===递归
数据结构与算法===递归
|
4月前
|
算法 前端开发 机器人
一文了解分而治之和动态规则算法在前端中的应用
该文章详细介绍了分而治之策略和动态规划算法在前端开发中的应用,并通过具体的例子和LeetCode题目解析来说明这两种算法的特点及使用场景。
一文了解分而治之和动态规则算法在前端中的应用
|
3月前
|
算法 定位技术
数据结构与算法学习九:学习递归。递归的经典实例:打印问题、阶乘问题、递归-迷宫问题、八皇后问题
本文详细介绍了递归的概念、重要规则、形式,并展示了递归在解决打印问题、阶乘问题、迷宫问题和八皇后问题等经典实例中的应用。
58 0
|
5月前
|
算法
【算法】递归、搜索与回溯——汉诺塔
【算法】递归、搜索与回溯——汉诺塔
|
5月前
|
数据可视化 算法 前端开发
基于python flask+pyecharts实现的中药数据可视化大屏,实现基于Apriori算法的药品功效关系的关联规则
本文介绍了一个基于Python Flask和Pyecharts实现的中药数据可视化大屏,该系统应用Apriori算法挖掘中药药材与功效之间的关联规则,为中医药学研究提供了数据支持和可视化分析工具。
151 2
|
6月前
|
算法 Python
python中算法递归错误(Recursion Errors)
【7月更文挑战第18天】
98 1
|
5月前
|
算法
【算法】递归总结:循环与递归的区别?递归与深搜的关系?
【算法】递归总结:循环与递归的区别?递归与深搜的关系?
119 0
|
5月前
|
算法
【算法】递归、搜索与回溯——简介
【算法】递归、搜索与回溯——简介

热门文章

最新文章