文章讲述递归见解与案例只是针对递归拓展解决一些数学问题,对于一些喜欢专研和感兴趣的码神提供不一样的思路;递归还有用于更多方面,文件的搜索等,在此就不进行介绍
递归三步
-
公式
-
终结点
-
递归方向
*针对有规律的计算使用*
- 案例1
f(x) = f(x - 1) + 1 ;
* 已知 f(1) = 3 ;
* 求: f(10) ?
公式即为:f(x) = f(x - 1) + 1
终点为:f(1) = 3
递归方向向下
遇到任务有规律的应用都可以通过这三个步骤快速分析,定义方法解决问题
- 定义方法
```
public static int arithmetic(int number){
//递归方向向下,保证不会StackOverflowError
if(number == 1){
//递归终点
return 1;
}else {
//公式
return arithmetic(number - 1) + 1;
}
}
```
---
- 案例2
f(x) = f(x+1) -1 ;
* 已知 f(1) = 3 ;
如果递归方向不适合,对公式进行变形,一定要递归方向是往终结点走的
* 求: f(10) ?
* f(x - 1) = f(x) - 1
* f(x) = f(x-1) + 1
---
除了以上还有其它的应用:
猴子吃桃问题:
一个猴子,当前摘了很多桃子。
第一天吃了一半,觉得不爽,又多吃了一个第二天又吃了剩下桃子的一半,觉得不还不爽,又多吃了一个
到了第10想再吃的时候,发现只有一个1个
问第一天摘了多少个桃子?
f(1) ?或者是任意一天的桃子数
- 公式:f(x+1) = f(x) / 2 - 1
- 变形-->f(x) = 2f(x+1) + 2
- 终结点:f(10) = 1
- 递归方向:向下
```
public static int arithmetic(int x){
if(x == 10){
return 1 ;
}else{
return 2*f(x+1) + 2;
}
}
```
```
/*
* 递归求n的阶乘 :
* n! = 1*2*3*4*5*...n
* 递归的三部:
* 公式: f(n) = f(n-1)*n;
* 终结点: f(1) = 1 ;
* 递归的方向:f(n) = f(n-1)*n;
* */
public class DiguiDemo {
public static void main(String[] args){
System.out.println(f(4));
}
public static int f(int x) {
if(x == 1) {
return 1 ;
} else {
return f(x-1)*x;
}
}
}
```
*还有一些啤酒问题,不死兔问题*
啤酒问题:
啤酒2元一瓶,4个盖子可以换一瓶,两个空瓶可以换一瓶
问10元可以喝多少瓶?
剩余多少空瓶和盖子。
有一对兔子,从出生后第三个月起每月都生一对兔子,小兔子3个月后又生一对兔子,加入兔子都不死,问第20个月后兔子对数是多少??
这道题依然用递归的方法解决
下一篇文章晒出代码