如何理解递归的思想

作为一个刚入坑的小白,在老师讲递归从开始到结束都是出于一脸懵逼的状态,在我看来递归就是函数不停的调用自身,至于它执行的过程是怎么样就不知道了,在后来的编程中对递归思想有了进一步的理解。
首先从写三个方法开始吧。

public static void method1(){
   System.out.println("我是方法一");
    }
     public static void method2(){
        System.out.println("我是方法二");
    }
    public static void method3(){
        System.out.println("我是方法三");
    }

这是三个比较简单的方法值,这三个函数基本做的是同一件事,那我们在主函数调用它们时需要每一个都要写出来。

public static void main(String[] args) {
        method1();
        method2();
        method3();

    }

他们的输出结果是:

我是方法一
我是方法二
我是方法三

Process finished with exit code 0

现在做一个小小的改动。

 public static void method1(){
        method2();
        System.out.println("我是方法一");
    }
    public static void method2(){
        method3();
        System.out.println("我是方法二");
    }
    public static void method3(){
        System.out.println("我是方法三");
    }

在method1和method2输出之前,分别调用method2和method3,现在在主方法中调用method1

 public static void main(String[] args) {
        method1();

method1执行,在输出之前调用了method2,所以只能等method2执行完毕才能输出,但是method2在输出之前又调用了method3.所以method2只能在method3执行结束之后才能输出。那么最后的输出顺序是method3-》method2-》method1

我是方法三
我是方法二
我是方法一

Process finished with exit code 0

当然如果代码改成先输出再调用也可以,只不过输出顺序会与上面的结果相反,我们发现其实这三个方法做的事情是一样的,只不过方法名不一样,那就可以把它们改成同名的方法,当然实际情况是不允许我们这样做的,现在用递归思想来写一个函数来达到上面一样的效果。

public static void digui(int x){
        digui(x-1);
        System.out.println("我是方法"+x);
    }

看一下这个递归方法。当然这个是错误的方法,这个方法在输出之前,要不停的调用自己,什么时候能结束?貌似他没有一个停下来的条件,就是会陷入一个死循环。所以我们应该给他设置一个出口。

public static void digui(int x){
        if(x>3){
            return;
        }
        digui(x+1);
        System.out.println("我是方法"+x);
    }
    public static void main(String[] args) {
        digui(1);
    }

执行结果:

我是方法3
我是方法2
我是方法1

Process finished with exit code 0

现在用递归方法做一件实际性的事,简单一点的,求12的阶乘。

public static int  factorial(int f){
        int result;
        if(f>0){
            result=f*factorial(f-1);
        }else {
            return 1;
        }
        return result;

    }
    public static void main(String[] args) {
        int result=factorial(12);
        System.out.println(result);
    }

结果:

479001600

Process finished with exit code 0

在使用递归的时候需要注意的事:
1.为防止递归陷入死循环,在递归函数中要及时的返回,也就是设置一个出口,在所有的递归函数中都要有一个终止递归的条件判断。
2.递归可以简化程序,但一般不能提高程序的执行效率。递归对内存的占用是巨大的,在使用递归函数时尽量少用局部变量。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值