递归拓展->三部曲

文章讲述递归见解与案例只是针对递归拓展解决一些数学问题,对于一些喜欢专研和感兴趣的码神提供不一样的思路;递归还有用于更多方面,文件的搜索等,在此就不进行介绍

递归三步

  • 公式

  • 终结点

  • 递归方向


*针对有规律的计算使用*

  • 案例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个月后兔子对数是多少??

这道题依然用递归的方法解决

下一篇文章晒出代码
 

猜你喜欢

转载自blog.csdn.net/JzCm__/article/details/82227884