看不懂的Java递归
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] a = {11,22,3,4,15,16,7,8,19,10};
System.out.println(max(a));
}
static int max(int[] array) {
return max(array, 0);
}
static int max(int[] array, int from) {
if (from == array.length - 1) {
return array[from];
}
// 程序进来后,上面这个判断需要循环10次,才能进入array[from];返回后进入下面语句判断
int r = Math.max(array[from], max(array, from + 1));
// 为什么这两个r这里会循环,并且from每次减1?
return r;
}
------解决方案-------------------- // 程序进来后,上面这个判断需要循环10次,才能进入array[from];返回后进入下面语句判断
int r = Math.max(array[from], max(array, from + 1));
// 为什么这两个r这里会循环,并且from每次减1?
这里并不是循环,而是因为 max(array, from + 1)这里递归调用了max函数啊。
------解决方案--------------------你用DEBUG模式应该能看的很清楚,第一次判断a[9]为数组最后一位直接返回,第二次判断a[8]和a[9]最大值,第2次判断a[7]和第二次的结果的最大值,递归直到a[0]得到最终结果。
------解决方案-------------------- int r = Math.max(array[0], m1 );//返回array[0]与之前的数m1比较大小
m1=Math.max(array[1], m2 );
m2=Math.max(array[2], m3 );
......
m8=Math.max(array[8],m9 );返回array[8],m9 的大着,继续一层一层的比
m9=Math.max(array[9],9);返回array[9]即 m9
------解决方案--------------------停止条件:当前数后面没有其他数字,那么当前数就是最大的,对应
if (from == array.length - 1) {
return array[from];
}
递归过程:每次都把当前数和后面那些数里面最大的作比较,并返回较大的那个,对应
int r = Math.max(array[from], max(array, from + 1));
return r;
递归函数max(int[] array, int from)含义:找出array中从from开始(包括from)到array最后的最大数
如果碰到递归不懂的,尝试回答上面这三个问题,再看代码就明白了
------解决方案--------------------
//array[0]=11,max(array,1)=22
------解决方案-------------------- 22
//array[1]=22,max(array,2)=19
------解决方案--------------------22
//array[2]=3,max(array,3)=19
------解决方案-------------------- 19
//array[3]=4,max(array,4)=19
------解决方案-------------------- 19
//array[4]=15,max(array,5)=19
------解决方案-------------------- 19
//array[5]=16,max(array,6)=19
------解决方案-------------------- 19
//array[6]=7,max(array,7)=19
------解决方案-------------------- 19
//array[7]=8,max(array,8)=19
------解决方案-------------------- 19
//array[8]=19,max(array,9)=10
------解决方案-------------------- 19
------解决方案--------------------递归是一种思想一种设计思路,跟具体编程语言没关系的。