这个涉及递归和数组的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
。