日期:2014-05-20  浏览次数:20810 次

看不懂的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
------解决方案--------------------
递归是一种思想一种设计思路,跟具体编程语言没关系的。