记得之前学递归总是没有一点感觉,今天在复习流的是否插播了一段递归,突然感觉茅塞顿开,哈哈哈哈,记录这欢喜的一刻。
「递归 recursion」是一种算法策略,通过函数调用自身来解决问题。它主要包含两个阶段。
- 递:程序不断深入地调用自身,通常传入更小或更简化的参数,直到达到“终止条件”。
- 归:触发“终止条件”后,程序从最深层的递归函数开始逐层返回,汇聚每一层的结果。
1、不死神兔问题
每个月的兔子对数,从第3个月开始,之后的每个月的兔子对数是前2个月兔子数的和;
1,1,2,3,5,8,13,21,34..............
2、计算i的阶乘
1!= 1
2!= 1*2
3!=1*2*3...... 等等依次类推下去
public static void main(String[] args) {
/**
* 不死神兔问题
*/
int rabbitCount = getRabbitCount(20);
System.out.println(rabbitCount);
/**
* 计算阶乘
*/
int i = getJC(5);
System.out.println(i);
}
public static int getRabbitCount(int i){
if (i == 1 || i == 2){
return 1;
}else {
return getRabbitCount(i - 1) + getRabbitCount(i -2);
}
}
public static int getJC(int n){
if (n == 1){
return 1;
}else {
return n * getJC(n - 1);
}
}
递归小心得,不管多么复杂的问题,只要有出口就可以将大量的运算交给计算机去算,但是一定要有限度,也就是最后程序要能够返回,不然容易堆调用过深出现异常StackOverflowError。
在此,对比一下for/while(迭代)和递归
虽然从计算角度看,迭代与递归可以得到相同的结果,但它们代表了两种完全不同的思考和解决问题的范式。
- 迭代:“自下而上”地解决问题。从最基础的步骤开始,然后不断重复或累加这些步骤,直到任务完成。
- 递归:“自上而下”地解决问题。将原问题分解为更小的子问题,这些子问题和原问题具有相同的形式。接下来将子问题继续分解为更小的子问题,直到基本情况时停止(基本情况的解是已知的)。
以上述的求和函数为例,设问题 F(n)=1+2+⋯+n 。
- 迭代:在循环中模拟求和过程,从 1 遍历到 n ,每轮执行求和操作,即可求得 F(n) 。
- 递归:将问题分解为子问题 F(n)=n+F(n−1) ,不断(递归地)分解下去,直至基本情况 F(1)=1 时终止。
谁能凭爱意要富士山私有~