递归的理解
//十进制的数转化为二进制
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,会发生递归栈溢出报错的现象,就是由于每次调用方法,就会在栈中开辟新的一份空间,当栈空间不够时,就会溢出。