递归的两个关键问题是:
1.出口问题,即什么时候结束;
2.逻辑相似性。相似性有时需要主动构造,不能相似的原因可能是缺少参数。
这与循环很相似:
for(int i=0;i<10;i++){
system.out.println(i);
}
循环中“i<10”是出口,即循环结束的条件;而“i++”则用于保证逻辑相似性,如果没有“i++”,则循环成了死循环,不停的打印0。
for(int i=0;i<10;){
system.out.println(i);
}
对于打印0~9,递归方法如下:如果方法体中“func(i-1)”变成“func(i)”,则情况类似于上面说的死循环。
public static void func(int i){
if(i>0) //出口问题
func(i-1); //逻辑相似性
system.out.println(i);
}
另外,递归的思想类似于一个多层次的机器,要完成一个任务,当前层只完成一小部分,剩下的任务交给剩下的其他层,这时就要保证逻辑相似性(以便能把任务交给下一层)。
总体看就是每层只完成小部分任务,并把剩余任务交给下一层。