首页 > 解决方案 > 这个涉及递归和数组的 java 代码是如何工作的?

问题描述

我在理解这段代码的工作原理时遇到了很多麻烦。我了解基本递归,例如阶乘代码,但我似乎无法理解这段代码。如果有人可以向我解释如何执行此代码,我将不胜感激。

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));
    }

}

标签: javarecursion

解决方案


首先,您应该注意到数组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"

因此,mystery转到数组的末尾,然后从后到前返回到目前为止观察到的当前最大元素并打印它。最后你会得到整个数组的最大元素。


推荐阅读