面向对象学习笔记9 - 递归调用
递归方法学习
方法自己调用自己的形式就叫递归,递归形式分为直接递归和间接递归
直接递归示例:
public class RecursionTest{
public static void main(String[] args){
RecursionTest test = new RecursionTest();
test.method1();
}
public void method1(){
System.out.println("method1()...");
method1();//调用方法自身
}
}//stackOverFlowError栈溢出异常
间接递归示例:
public static void A(){
B();
}
public static void B(){
C();
}
public static void C(){
A();
}
举例:
File类的对象表示一个文件目录。
计算指定的文件目录的大小,遍历指定的文件目录中所有的文件,删除指定的文件目录。
-递归方法包含了一种隐式的循环。
-递归方法会重复执行某段代码,但这种重复执行无需循环控制。
-一定要向已知方向递归,否则会进入死循环。
示例:
public class RecusionExer01{
/*练习1:
已知一个数列:f(20) = 1,f(21) = 4,f(n + 2) = 2 * f(n + 1) + f(n),
其中n是大于等于0的整数,求f(10)的值。*/
public int f(int n){
if(n == 20){
return 1;
}else if(n == 21){
return 4;
}else{
return f(n + 2) - 2 * f(n + 1);//这里将参数10带入方法,通过有限次递归后
//可以转化为每一项都是以20或21为参数的结果
//即向已知方向递归
}
}
/*练习2:
已知有一个数列:f(0) = 1,f(1) = 4,
f(n + 2) = 2 * f(n + 1) + f(n),其中n是大于0的整数,求f(10)的值
public int func(int n){
if(n == 0){
return 1;
}else if(n == 1){
ruturn 4;
}else{
return func(n + 2) - 2 * func(n + 1);//同样的,为了向已知方向递归所以先将题目给出的公式移项,后使用
}
}
}
这段代码是在说明递归一定要指向一个已知的结果,例子中直接带入式子有可能会永远都无法递归运行到
预期的位置,需要在编写代码时,对条件进行一些变形,使得最终的“目的地”是可以到达的。
!注意:
1、递归会占用大量的堆栈,内存耗用多,在递归调用层次多时速度比循环慢得多。
2、要求高性能时尽量避免递归。

浙公网安备 33010602011771号