##一.什么场景会用到递归方法?
- 原问题可以拆分成多个子问题;
- 拆分后的子问题和原问题除了规模/大小不同之外,解决的思路完全相同;
- 存在递归的终止条件(拆分子问题的过程是有限的,拆分到最后一个子问题的终止条件)。
例:在计算5!时,可以把它拆分成 5 * 4!的形式,
4!就可以看作5!拆分出的一个子问题。
拆分出的子问题可以继续拆分:
4!=4* 3!
…
2 !=2* 1!;
当我们拆分到1!时,不能继续差分,1!=1就看做这个递归方法的终止条件。
##二.如何正确写出递归函数?
1.抓语义,明白这个递归函数在解决什么问题;
2.假设这个函数已经写好了,利用这个函数解决已经拆分出来的子问题;
3.把握递归的终止条件
(抓语义、找终止、写当前)
public static int getfactorial(int n){
//n<=2就是这个递归方法的终止条件,因为当n<=2时,n的阶乘就是它本身
if (n<=2){return n;}
//把n的阶乘拆分成 n*(n-1)!的子问题
return n*getfactorial(n-1);
}
##三.从方法底层原理看待递归
递归本质上就是方法不断地压栈和弹栈的过程。
##四.设计一个方法,删除文件夹
public void deleteFile(File file){
//先确定file是个文档还是一个文件夹
File[] files=file.listFiles();
//如果数组存在,表明file是个文件夹
if(files!=null){
//如果数组非空,先删除文件夹里的全部东西
if (files.length!=0){
for (File f:files){
//递归调用deleteFile方法,删除所有file的子文件夹
deleteFile(f);
}
}
}
file.delete();
}