面向对象学习笔记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、要求高性能时尽量避免递归。

posted @ 2025-05-05 03:18  谁来着?  阅读(19)  评论(0)    收藏  举报