java - 这个涉及递归和数组的 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));
}
}
解决方案
首先,您应该注意到数组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
转到数组的末尾,然后从后到前返回到目前为止观察到的当前最大元素并打印它。最后你会得到整个数组的最大元素。
推荐阅读
- swiftui - SKStoreProductViewController 必须在模态视图控制器 SWIFTUI 中使用
- python - 不明白为什么我的函数不能被调用
- azure - 设置与 ServiceNow 的 Azure ITSM 连接失败
- python-3.x - 在 Canny 边缘检测器中绘制梯度,在 python 中显示不支持的数据类型错误
- python - 如何在python的元组参数中传递一个函数?
- python - 无法在调试模式下运行 locust
- python - python中有没有一种快速的方法可以将字符串'1/100'转换为float 0.01?
- php - 循环遍历多维数组并为每个分类添加税收查询
- git - 当在不同的分支中修改相同的文件时,git 应该给我操作冲突
- reactjs - 在 IE 中对 MS GRAPH 进行身份验证时出现 MSAL 错误