递归的理解

    //十进制的数转化为二进制
    public static void toBin(int num){
        if(num > 0){
            toBin(num/2);
            System.out.println(num%2);
        }
    }

  以上面的十进制转化为二进制为例:传参数传入6,把6转化为二进制:使用递归函数不断的调用自身,由于方法在java中是存放到栈中的:在栈中分配空间如下图:

递归总有结束的时候,当if(0>0)的时候结束,然后逆向输出结果,从下到上,最后一个递归方法直接结束,因为if(0>0)不成立,也就是说toBin(0)方法没打印结果,到倒数第二个toBin(1),首先if(1>0)条件成立,执行到toBin(1/2)也就是toBin(0),由于知道toBin(0)执行完了,所以toBin(1/2)执行完,相当于直接执行输出方法(1%2)=1,所以打印出1,同理toBin(3/2)执行完了在,执行打印语句3%2,打印出1,同理toBin(6/2)执行完了,执行打印语句

6%2=0,结果为110.

例子2:

//求1+2+3....+n的和
    public static int sum(int n){
        if(n==1){//递归结束的标志
            return 1;
        }else{
            return n+sum(n-1);
        }
    }

分析和上例一样,先正向传参,然后逆向返回结果,最后结果为6。当我们传入8000000的时候,Exception in thread "main" java.lang.StackOverflowError,会发生递归栈溢出报错的现象,就是由于每次调用方法,就会在栈中开辟新的一份空间,当栈空间不够时,就会溢出。

原文地址:https://www.cnblogs.com/200911/p/3859301.html