通过栈的方式理解递归调用

通过栈的方式理解递归调用

1、理解系统中CPU和内存之间的工作

关系如下图1.1所示
在这里插入图片描述

​ 1.1 cpu与内存之间的工作关系

  • 控制单元:有程序计数器、指令计数器

    • 程序计数器:用于存储指令的地址

    • 指令计数器:执行程序计数器的指令,如果运到计算类型的指令交给逻辑运算单元,遇到粗存储类型的指令,则交给控制单元执行

  • cpu指令周期:从读取执行、执行指令、再到下一条指令,循环

  • 数据和指令是分开存放在内存里面,数据存放在数据段,指令存放在正文段。编译器会将执行运算的代码翻译成指令存放在指令中,如下图所示

    在这里插入图片描述

  • 正文段存放着指令,load指令将地址为0x109的数据装入到寄存器R0中

  • add指令将寄存器的R0和R1的数据进行相加,并存放到R2中

  • 最后将结果R2存放到数据段中去

2、递归过程

我们可以通过栈的方式来理解递归的过程

    void test5(){
       int ret = sum(3);
        System.out.println(ret);
    }
    public static int sum(int n){
        if (n == 0){
            return 1;
        }else {
            return n*sum(n-1);
        }
    }

当第一次执行的时候,n=3;在执行n* sum(n-1)时,即3* sum(2);如下图所示:

在这里插入图片描述

这时返回值器中是没有值的,这里的test5中的下一条指令为 输出System.out.println(ret);,继续调用2* sum(1),如图所示;

在这里插入图片描述

每次调用都会分配参数和局部变量,这里的n(3)的下一条指令为 return 3* sum(2),后面同理。

在这里插入图片描述

只有当n=0时,返回值存储器里面存放1,然后依次往下执行上一个函数里面的下一条语句。

3、总结

本章主要介绍了程序在cpu和内存的工作过程,以及通过栈的方式来理解递归的过程。内存中以栈的形式来存储指令和数据,其中对于数组和对象在栈中以地址的形式,而不是具体数据,具体数据存放在堆中

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值