文章目录
递归
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];
}
}