黑马程序员——递归

------Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

1. 是什么? 

(1)方法定义中调用方法本身的现象叫做递归

(2)有什么用?

把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。

2. 怎么用?

如何使用递归:

       A:递归必须要有出口

       B:递归的表达式

3. 什么时候用?
案例

              A:求阶乘

/**

        * 5! = 5*4!

        *          5*4*3!

        *          5*4*3*2!

        *          5*4*3*2*1!

        * 你知道的1!=1

        *

        * 你只要知道:

        * 递归的出口:1!=1

        * 递归的式子:n! =n*(n-1)!

        */

      

       public static intgetTotal(int m){  //m=5

              if(m==1){

                     return 1;

              }

              else{

                     returnm*getTotal(m-1);

                     /*

                      * 5*getTotal(4) 24

                      *    4*getTotal(3) 6

                      *      3*getTotal(2) 2

                      *           2*getTotal(1) 1

                      */

 

              B:求斐波纳契数列的第二十项的值

斐波纳契数列:

 * 1,1,2,3,5,8,13,21...

 *

 * 分析数列规律:

 *          第一项和第二项是1。

 *          从第三项开始:每一项是前两项之和。

 *

public class DiGuiDemo2 {

       public static voidmain(String[] args) {

              //定义数组来实现

              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]);

             

              //不用数组做

              int a = 1;

              int b = 1;

             

              for(int x=0; x<18; x++){ 

                     //用一个临时变量存储a的值

                     int temp = a;

                     a = b;

                     b = temp + b;

              }

              System.out.println("斐波纳契数列的第二十项的值是:"+b);

             

              //用递归做

              System.out.println("斐波纳契数列的第二十项的值是:"+getFib(20));

       }

 

       /**

        * 递归的出口:第一项和第二项的值都是1  a b

        * 递归的表达式:第三项开始:是前两项之和 a+b

        */

       public static int getFib(intm){

              if(m==1 || m==2){

                     return 1;

              }

              else{

                     returngetFib(m-1)+getFib(m-2);

              }

       }

4. 有什么特点?

       (1)递归的注意事项

              A:递归次数不要太多

              B:递归必须有出口

5. 图解递归5的阶乘


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值