java - 我不确定为什么 myst() 以这种方式作为递归方法工作
问题描述
public class Recur2 {
public static void main(String [] args) {
myst(4);
}
public static void myst(int a) {
if (a != 0) {
System.out.println("Before: " + a);
myst(a-1);
System.out.println("After : " + a);
}
}
}
输出应该是:
Before: 4
Before: 3
Before: 2
Before: 1
After: 1
After: 2
After: 3
After: 4
但我并不完全肯定为什么会这样。代码中间完成了什么myst(a-1)
,为什么后面是升序?
解决方案
但我并不完全肯定为什么会这样。
这是Java代码中递归的一个简单示例。它以这种方式工作......因为这就是递归的工作方式。
递归发生在方法调用自身时。
myst(a-1)
在代码中间完成了什么
那就是递归。那是在myst
呼唤自己。
你会注意到它myst
调用自己的参数比调用它的参数小一。所以会发生什么:
myst(4)
来电myst(3)
myst(3)
来电myst(2)
myst(2)
来电myst(1)
myst(1)
来电myst(0)
myst(0)
不递归......因为a != 0
不是真的!
...为什么它之后按升序排列?
查看打印语句的位置。有一张“在下降的路上”和另一张“在回来的路上”。并看看每个人都在打印的表情。它是a
……这个调用的本地参数…… 。
如果它仍然不适合您,请考虑一个现实世界的类比。例如:
想象你在一个有梯子的房间里。想象一下,您已经爬到阶梯的第 4 级。你的计划是在后者的底部,然后回到 4。你有几个规则。
- 在你下台之前,你
"BEFORE"
先喊出当前的梯级号码。- 后退一步后,你大声喊出
"AFTER"
,然后是当前的梯级号码。问:隔壁房间的人听到了什么?
- 答:
"BEFORE 4"
暂停,"BEFORE 3"
暂停,"BEFORE 2"
暂停,"BEFORE 1"
暂停,"AFTER 1"
暂停,"AFTER 2"
暂停,"AFTER 3"
暂停,"AFTER 4"
。
推荐阅读
- python - 当模板中存在另一个表单时,如何知道提交按钮是否使用 get 方法单击了表单?
- javascript - 使用 CSS / JavaScript 将样式设置为稍后可见的元素
- python - 如何在 Python 中对许多字典应用一些操作(或:如何在 for 循环中修改字典)
- excel - Excel:遍历嵌套文件夹并复制粘贴文件:需要对象错误
- react-native - 登录成功后如何加载主屏幕而不显示登录屏幕?
- java - 从有序列表开始创建列表列表
- javascript - 使用文本更新 DOM 节点会覆盖旧文本
- asynchronous - TCL中的fileevent非常慢
- android - 模拟 SharedPreferences.Editor.putString()
- tfs - 为什么 tfs 2018 部署组阶段将在前一个部分失败后运行?