首页 > 解决方案 > 我不确定为什么 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),为什么后面是升序?

标签: javarecursion

解决方案


但我并不完全肯定为什么会这样。

这是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"


推荐阅读