关于递归的相关介绍-让你深刻了解递归

递归

1,什么是递归?

​ 递归概述: 方法定义中调用方法本身的现象就是递归

​ 递归简单的说就是无限的套娃直到可以解决,想必大家都听过一个故事:

​ 从前有座山,山中有座庙,庙里有个老和尚,老和尚在给小和尚讲故事:“ 从前有座山,山中有座庙,庙里有个老和尚,老和尚在给小和尚讲故事:“ 从前有座山,山中有座庙,庙里有个老和尚,老和尚在给小和尚讲故事:“ 从前有座山,山中有座庙,庙里有个老和尚,老和尚在给小和尚讲故事:“…"

这就是一个简单的递归无限套娃。

2,递归的思想是什么?

​ 递归的思想就是,大化小 简单的说就是将一个大问题幻化为小问题,如果小问题也无法解决就再次划分,不断缩小范围

在这里插入图片描述

3,递归要注意些什么?

3.1首先明确你所构建的函数的具体功能

​ 也就是说,这是完全由你自己来定义的。也就是说,我们先不管函数里面的代码如何实现是什么,而你要先明白,你这个函数是要用来干什么明白其功能。

​ 正如:

//求n的阶乘,n>0
public static int  fun(int n){
   
}

3.2必须有结束条件

​ 也就是要有出口,否则就是死递归无底洞出不来

3.3调用自身函数形成递归

​ 就是在函数中调用自身函数

例如,f(n) 这个范围比较大,我们可以让 f(n) = n * f(n-1)。这样,范围就由 n 变成了 n-1 了,范围变小了,并且为了原函数f(n) 不变,我们需要让 f(n-1) 乘以 n。

例如:

//求n的阶乘,n>0
    public static int fun(int n) {
        if (n == 1) {
            return 1;
        }
        return n * fun(n - 1);
    }

​ 这个也是大化小的思想,将n的阶乘变为n*(n-1)! 这样就简化了,而对于n-1的阶乘以此类推无限套娃就最终可以到能解决的n=1的时候。

3.4递归的次数不可以过多

​ 每一次调用方法都会在栈中进行增加一层栈帧,栈的大小是有限的如果调用过多就会出现栈溢出的现象。

次数越多则效率越低,消耗的栈中的空间也就越多。

4, 递归的案例应用

​ 递归可以解决一些问题:例如求阶乘,不死神兔问题(斐波那契数列问题)

求n的阶乘

 public static void main(String[] args) {
     	Scanner sc=new Scanner(System.in);
     	int n = sc.nextInt();
     	if(n>0){
		System.out.println(n+"的阶乘为"+fun(n));
        }
    }
//求n的阶乘,n>0
    public static int fun(int n) {
        if (n == 1) {
            return 1;
        }
        return n * fun(n - 1);
    }
案例演示:
   需求:不死神兔问题(斐波那契数列)
   有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问第二十个月的兔子对数为多少?

分析

月份  对数
 1     1
 2     1
 3     2
 4     3
 5     5
 6     8
 9     13
 10    21
 斐波那契数列:前两个数都是1,从第三个数开始,这个数等于他前两个数之和
	//递归做法
public static void main(String[] args) {
       System.out.println(fun(20));
    }

private static int fun(int n) {
        if(n==1 || n==2){
            return 1;
        }
        return fun(n-1)+fun(n-2);
    }
  //普通方法来做一下  数组来做
int []a=new int[20];
for (int i = 0; i < 20; i++) {
    if(i==0 || i==1){
        a[i]=1;
    }
    if(i>=2){
        a[i]=a[i-1]+a[i-2];
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值