经常会听到递归二字,却一直不得其法,今天来彻底搞懂它
递归就是方法自己调用自己,每次调用传入不同的变量,递归可以让代码简洁
举例分析 |
1.打印问题
写一个打印的方法,不停的调用自己
执行结果如下
图解分析
如下图,
- 执行main方法,添加第一个栈帧
- 第一次调用print:传入参数4,栈中添加第二个栈帧,n=4执行到第7行的时候,if条件成立。那么,调用print(4-1),此时已经开始递归(我理解的此时递归处于递的阶段,等到print调用结束,开始返回的时候就是递归的归的过程)
- 第二次调用print:传入参数3,栈中添加第三个栈帧,同理if条件成立
- 第三次调用print:传入参数2,栈中添加第四个栈帧,if条件n>2,不成立,开始执行第10行代码,打印
- 打印完n=2,顶层栈帧退出,继续执行第二层,此时n=3,(if中调用print方法令n=2,但是因为n是局部变量,并不会影响第二层栈帧中n的值),所以打印出
- 同理第三层打印出n=4,然后main方法执行完毕,退出最后一层栈帧
小结
上面的递归过程中,只有顶层的栈不满足if条件,执行了第10行的打印方法,然后退出,在顶层的栈的方法执行完毕之前,第二层和第三层的栈此时都才执行到if语句中,并未执行完毕,所以当顶层栈执行完毕之后,就会依次回归
2.阶乘问题
代码如下
main函数
阶乘方法
执行结果