0
点赞
收藏
分享

微信扫一扫

递归机制学习

青乌 2022-04-22 阅读 50
java

一、输出问题案例

public class Recursion01 {
    public static void main(String[] args) {
        T t=new T();
        t.test(5);
    }
}

class T{
    public void test(int n){
        if(n>2){
            test(n-1);
        }
        System.out.println("n="+n);
    }
}

输出结果:

代码分析:main()方法创建T对象,test(5)入栈,∵5>2->test(4)入栈,直到n=1时达到递归出口,此时系统栈中内容为:

test(2)

test(3)

test(4)

test(5)

由于栈后进先出的特性,先调用test(2),n>2不成立终止递归执行输出代码,此时n=2,得到输出结果。其余方法依次出栈并输出对应结果。

二、阶乘问题案例

public class Recursion01 {
    public static void main(String[] args) {
        int result= t.factorial(5);
        System.out.println("阶乘结果为:"+result);
    }
}

class T{
    public int factorial(int n){
        if(n==1){
            return 1;
        }
        return n*factorial(n-1);
    }
}

代码分析:main()方法创建T对象,factorial(5)入栈,∵5!=2->factorial(4)入栈,直到n==1时达到递归出口,此时系统栈中内容为:

factorial(1)------结束factorial(1),返回factorial(1)=1

factorial(2)------结束factorial(2),返回factorial(2)=2*factorial(1)=2

factorial(3)------结束factorial(3),返回factorial(3)=3*factorial(2)=3*2=6

factorial(4)------结束factorial(4),返回factorial(4)=4*factorial(3)=4*6=24

factorial(5)------结束factorial(5),返回factorial(5)=5*factorial(4)=5*24=120

栈中方法全部结束,返回factorial(5)

三、递归使用规则

1.每执行一个方法,都要入系统栈

2.每个方法的局部变量独立,不受其他方法影响。

3.递归函数形参只能是基本数据类型。用引用数据类型会共享使用。

4.递归必须向递归出口逼近,否则会栈溢出。

5.当方法执行完毕,或者遇到return时,就会返回。返回给谁呢?谁调用的就返回给谁。返回之后呢,这个方法就出栈,释放系统栈空间。

四、使用递归思路(正向):

1.寻找递归出口(写到if语句里)<可能有多个>

2.编写递归体:根据题设编写

五、使用递归思路(逆向)

根据题设找出规律,找出紧挨着的两天的关键值得关系,构造递归函数。(难)

六、递归习题

1.斐波那契数列

public class Recursion02 {
    public static void main(String[] args) {
        V v=new V();
        System.out.print( v.Fibonacci(5));
    }
}

class V{
    int Fibonacci(int n){
        if(n==1)    return 1;
        if(n==2)    return 1;
        return Fibonacci(n-1)+Fibonacci(n-2);
    }
}

2.猴子吃桃子问题:有一堆桃子,猴子第一天吃了其中的一半,并再多吃了一个!以后每天猴子都吃其中的一半,然后再多吃一个。当到第 10 天时,想再吃时(即还没吃),发现只有 1 个桃子了。问题:最初共多少个桃子?

public class Recursion03 {
    public static void main(String[] args) {
        Z z=new Z();
        int peaches=z.peaches(1);
        System.out.println(peaches);
    }
}

class Z{
    //前一天的桃子=(后一天的桃子+1)*2
    int peaches(int day){
        if(day==10){
            return 1;
        }else if(day>=1&&day<=9){
            return (peaches(day+1)+1)*2;
        }else{
            System.out.println("day只能在1-10");
            return -1;
        }
    }
}
举报

相关推荐

递归的执行机制

java-面向对象-递归机制

递归-学习笔记

初识递归学习

JAVA——方法递归学习

异常机制学习

0 条评论