这个涉及递归和数组的java代码是如何工作的?

这个涉及递归和数组的java代码是如何工作的?,java,recursion,Java,Recursion,我很难理解这段代码是如何工作的。我理解基本的递归,就像阶乘代码一样,但我似乎无法理解这段代码。如果有人能向我解释如何遵循此代码,我将不胜感激 public class Question3 { public static int mystery(int[] a){ return mystery(a,0); } public static int mystery(int [] a, int x) { if (x == a.length-1

我很难理解这段代码是如何工作的。我理解基本的递归,就像阶乘代码一样,但我似乎无法理解这段代码。如果有人能向我解释如何遵循此代码,我将不胜感激

public class Question3 {

    public static int mystery(int[] a){ 
        return mystery(a,0);
    }

    public static int mystery(int [] a, int x) {
        if (x == a.length-1)
            return a[x];
        else {
            int z = mystery(a, x+1);
            System.out.println(z);
            if (a[x] > z)
                return a[x];
            else
                return z;
        }
    }

    public static void main(String[] args) { 
        int[] testArr = {4, 23, 5, 11, 7};
        System.out.println(mystery(testArr));
    }

}

这个方法递归地检查最大的数字是什么,
System.out.println(神秘(testArr))
将打印最大的数字
23
。如果你用另一个数字更新数组,你将能够检查它

为了清楚起见,您可以将
神秘(int[]a,int x)
方法更改为:

public static int mystery(int [] a, int x) {
    if (x == a.length-1)
        return a[x];
    else {
        int z = mystery(a, x+1);
        System.out.println(z);
        return Math.max(a[x], z);
    }
}

中强调返回Math.max(a[x],z)。而且会更清楚地知道他们在做什么。选取较大的数字并递归检查下一个数字。

首先,您应该注意,数组
a
在整个代码中既没有被替换也没有被修改。这意味着
a.length-1
将始终计算为
4

该代码具有以下调用堆栈:

main()
  mystery(testArr)
    mystery(testArr, 0)
      if block: 0 != 4
      mystery(testArr, 1)
        if block: 1 != 4
        mystery(testArr, 2)
          if block: 2 != 4
          mystery(testArr, 3)
            if block: 3 != 4
            mystery(testArr, 4)
              if block: 4 == 4 // returns testArr[4]: 7
            z = 7 // prints "7"
            a[3]: 11 > 7 // returns testArr[3]: 11
          z = 11 // prints "11"
          a[2]: 5 <= 11 // returns z: 11
        z = 11 // prints "11"
        a[1]: 23 > 11 // returns testArr[1]: 23
      z = 23  // prints "23"
      a[0]: 5 <= 23 // returns 23
    returns 23
  prints "23"
main()
神秘(testArr)
神秘(testArr,0)
如果块:0!=4.
神秘(testArr,1)
如果块:1!=4.
神秘(testArr,2)
如果块:2!=4.
神秘(testArr,3)
如果块:3!=4.
神秘(testArr,4)
if块:4==4//返回testArr[4]:7
z=7//打印“7”
a[3]:11>7//返回testArr[3]:11
z=11//打印“11”
a[2]:5 11//返回testArr[1]:23
z=23//打印“23”

a[0]:5可能尝试使用调试器逐行遍历代码并逐步进入递归。这可能会让你更好地理解。但换句话说:这段代码首先到达所提供数组的末尾,通过一步一步向左比较值,返回当前的最大值,通过这样做,最终得到数组的最大值,并在末尾打印它。我知道7在哪里打印,然后我有点困惑。为什么x的值突然下降,为什么Z的值不是7?
x
是方法范围内的所有局部参数。
7
打印在调用
神秘(testArr,3)
中,因此在整个方法中
x=3
神秘(testArr,4)
不会影响
神秘(testArr,3)
局部范围内的值
x