通过栈的方式理解递归调用
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和内存的工作过程,以及通过栈的方式来理解递归的过程。内存中以栈的形式来存储指令和数据,其中对于数组和对象在栈中以地址的形式,而不是具体数据,具体数据存放在堆中