Java笔记(递归算法):

1.递归算法:


1)什么是递归:          

方法调用方法本身的一种现象! 而不是方法嵌套方法

2)核心代码:          

 public int get(int n){
               System.out.println(n)  ;
                if(n!=0){
                     get(n--) ;
                }
              }

3)递归思想:

              1)必须定义一个方法(函数)
              2)有一定的规律
              3)必须有出口条件(结束条件)   ,如果没有结束条件就是死递归!

4)案例:

 *  需求:
 *           求5的阶乘!
 *
 *           分析:
 *                  1)普通for循环---求阶乘思想
 *                  2)方法递归解决这个问题
 *
 *                  a)必须有一个方法
 *                  b)有规律
 *                  c)有结束条件(出口条件)
 *
 *                 求5的阶乘
 *                      拆分法:将一个大的问题:拆分成 若干个小问题

public class DiGuiTest {
    public static void main(String[] args) {

        //定义最终结果变量
        int jc = 1 ;
        for(int x = 1 ;x <= 5; x ++){
            jc*=x ;
        }
        System.out.println("5的阶乘是:"+jc);

        System.out.println("--------------------------------------") ;

        System.out.println("5的阶乘是:"+getResult(5)) ;
    }

    //定义方法
    private static int getResult(int n) {//5
        //判断n的值
        if(n==1){
            return  1 ; //出口条件(结束条件)
        }else{
            return n*getResult(n-1) ;//5*getResult(4) ;
        }
    }
}


*      需求:
 *           有一对兔子,从出生后第三个月起每个月产生一对兔子,小兔子长到第三个月后每个月又产生一对兔子;如果兔子都不死,
 *                           第二十个月兔子的对数是多少?     (不死神兔)
 *  *   已知就是前两个月的兔子的对数都是1;
 *  *                          规律:
 *  *                              第一个月:1
 *  *                              第二个月:1
 *  *                              第三个月:2
 *  *                              第四个月:3
 *  *                              第五个月:5
 *  *                              第六个月:8
 *  *                              第七个月:13
 *  *
 *  *                              ...
 *  *                              ...
 *  *
 *  *                              几种方式:
 *  *                                  1)数组方式解决
 *  *                                  2)递归:定义方法/找规律/找出口条件
 *
 *  规律:
 *          已知第一个月和第二个月的兔子对数都是1
 *          从三个月开始,每个月兔子对数是前两个月之和
 *
 *
 *        递归方式
 *              1)定义方法(第二十个月 :20) ---参数为n
 *              2)如果n==1或者n==2  return 1 ;  如果n是第一个月或者n是第二个月,兔子对数1
 *              3)如果不是第一个月或者第二个月: 从三个月开始,每个月兔子对数是前两个月之和
 *
 *
 *          应用场景:
 *                  使用递归思想解决实际问题:
 *
 *                        需要不断的删除带内容的目录 :递归删除带内容的目录---如何表示文件? IO流File
 *                              demo目录
 *                                      子目录
 *                                          子子目录
 *                                              xx.java
 *                                      xx.java
 *
 */
public class DiGuiTest2 {

    public static void main(String[] args) {

        //数组方式
        //已知前两个的兔子对数都是1
        //创建一个数组,长度20
        int[] arr = new int[20] ;
        arr[0] = 1 ;
        arr[1] = 1 ;

        //第三个月,从三个月开始,每个月兔子对数是前两个月之和
        for(int x =  2;  x <arr.length; x++){
            arr[x] = arr[x-1] + arr[x-2] ;
        }
        System.out.println("第二十个月的兔子对数是:"+arr[19]);//6765
        System.out.println("----------------------------------------") ;

        System.out.println("第二十个月的兔子对数是:"+getRabbit(20)) ;
    }

    //定义一个方法
    public static int getRabbit(int n){//第n个月
        //出口条件
        //n==1或者n==2: 兔子的对数1
        if(n==1|| n==2){
            return 1 ;
        }else{
           return getRabbit(n-1) + getRabbit(n-2) ;
        }
    }
}




             

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值