什么是递归
- 程序调用自身的编程技巧称为递归。
- 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法
递归问题的特点
- 一个问题可被分解为若干层简单的子问题
- 子问题和其上层问题的解决方案一致
- 外层问题的解决依赖于子问题的解决
递归结构
递归结构包括两个部分:
- 递归结束条件。解答:什么时候丌调用自身方法。如果没有条件,将陷入死
循环。 - 递归体。解答:什么时候需要调用自身方法。
递归示例
使用递归求n!
public class A {
static long factorial(int n){
if(n==1){
return 1;
}else{
return n*factorial(n-1);
}
}
public static void main(String[] args) {
long d1 = System.currentTimeMillis();
System.out.println("阶乘的结果: ",factorial(10));
long d2 = System.currentTimeMillis();
System.out.println(“递归费时: ”,d2-d1);
//耗时:32ms
}
}
递归的优缺点
- 递归的优点
简单的程序 - 递归的缺点
但是递归调用会占用大量的系统堆栈,内存耗用多,
在递归调用层次多时速度要比循环慢的多
递归的使用场合
- 任何可用递归解决的问题也能使用迭代解决。
- 当递归方法可以更加自然地反映问题,幵且易于理解和调试,并且不强调效率问题时,可以采用递归;
- 在要求高性能的情况下尽量避免使用递归,递归既花时间又耗内存。
小结
- 递归简单,但是内存耗用多,速度要比循环慢
- 任何可用递归解决的问题也能使用循环解决,反之不见得
- 在程序运行过程中,有时需要调用程序本身,此时可以使用递归
注意:
在程序中,能不使用递归就不要使用递归
使用递归的时候会加大资源的消耗
如果递归的层次比较深,会造成栈溢出。
如果不使用递归无法解决问题的话,就必须要使用递归
比如:输出某个磁盘目录下的所有文件名称