Java递归

递归

1. 生活中的故事

从前有坐山,山上有座庙,庙里有个老和尚给小和尚将故事,讲的就是:

"从前有座山,山上有座庙,庙里有个老和尚给小和尚讲故事,讲的就是:

"从前有座山,山上有座庙..."

"从前有座山......"

上面的两个故事有个共同特征:自身中又包含了自己, 该种思想在数学和编程中非常有用,因为有些时候,我们遇到的问题直接并不好解决但是发现将问题拆成其子问题之后,子问题与原问题又相同的解法,等子问题解决之后,原问题就迎刃而解了

*2. 递归的概念

一个方法在执行过程中调用自身,就称为"递归"。

递归相当于数学上的"数学归纳法",有一个起始条件,然后有一个递推公式。

例如,我们求N!

起始条件:N = 1 的时候,N!为1.这个起始条件相当于递归的结束条件

递归公式:求N!,直接不好求,可以把问题转换成N => N*(N - 1)!

递归的必要条件:

  1. 将原问题划分成其子问题,注意:子问题必须要与原问题的解法相同

  2. 递归出口

**代码示例:**递归求 N 的阶乘

java 复制代码
public static void main(String[] args){

    int n = 5;

    int ret = factor(n);

    System.out.println("ret = " + ret);

}

public static int factor(int n){

    if (n == 1){

        return 1;

}

        return n * factor(n - 1);//factor 调用函数自身

}



//执行结果

ret = 120

3. 递归执行过程分析

递归的程序的执行过程不太容易理解,要想理解清楚递归,必须先理解清楚"方法的执行过程",尤其是"方法执行结束之后,回到调用位置继续往下执行"。

**代码示例:**递归求N的结成

java 复制代码
public static void main(String[] args) {

    int n = 5;

    int ret = factor(n);

    System.out.println("ret = " + ret);

}

public static int factor(int n) {
    
    System.out.println("函数开始, n = " + n);

if (n == 1) {

    System.out.println("函数结束, n = 1 ret = 1");

        return 1;

}

    int ret = n * factor(n - 1);

    System.out.println("函数结束, n = " + n + " ret = " + ret);

    return ret;

}

// 执行结果

函数开始, n = 5

函数开始, n = 4

函数开始, n = 3

函数开始, n = 2

函数开始, n = 1

函数结束, n = 1 ret = 1

函数结束, n = 2 ret = 2

函数结束, n = 3 ret = 6

函数结束, n = 4 ret = 24

函数结束, n = 5 ret = 120

ret = 120

执行过程图:

程序按照序号中标识的 (1) -> (8) 的顺序执行.

关于 "调用栈"

方法调用的时候, 会有一个 "栈" 这样的内存空间描述当前的调用关系. 称为调用栈.

每一次的方法调用就称为一个 "栈帧", 每个栈帧中包含了这次调用的参数是哪些, 返回到哪里继续执行等信息.

后面我们借助 IDEA 很容易看到调用栈的内容.

相关推荐
程序员_三木2 分钟前
Three.js入门-Raycaster鼠标拾取详解与应用
开发语言·javascript·计算机外设·webgl·three.js
是小崔啊12 分钟前
开源轮子 - EasyExcel01(核心api)
java·开发语言·开源·excel·阿里巴巴
ALISHENGYA18 分钟前
全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之分支结构(switch语句)
数据结构·算法
tianmu_sama18 分钟前
[Effective C++]条款38-39 复合和private继承
开发语言·c++
chengooooooo20 分钟前
代码随想录训练营第二十七天| 贪心理论基础 455.分发饼干 376. 摆动序列 53. 最大子序和
算法·leetcode·职场和发展
黄公子学安全21 分钟前
Java的基础概念(一)
java·开发语言·python
liwulin050622 分钟前
【JAVA】Tesseract-OCR截图屏幕指定区域识别0.4.2
java·开发语言·ocr
jackiendsc27 分钟前
Java的垃圾回收机制介绍、工作原理、算法及分析调优
java·开发语言·算法
Yuan_o_27 分钟前
Linux 基本使用和程序部署
java·linux·运维·服务器·数据库·后端
Oneforlove_twoforjob31 分钟前
【Java基础面试题027】Java的StringBuilder是怎么实现的?
java·开发语言