16_一篇文章让你理解瑟瑟发抖的递归方法

前言:

     这段时间学的递归应用比较多。表面上递归不重要,只要理解就行。但是在实际应用中,递归对于这种m(n)与m(n-1)有规律关系的算法,是一种好用的工具。本文分为两部分,学会写递归和递归的应用。

一 、使用递归的姿势:

   通过几个简单的案例来学会如何写递归:

   题目1:求阶乘5!

 步骤1:设置一个n值 .从n=1,2,3...这样开始枚举,直到最后发现规律
      -分析题目可知:
       n = 1 return m(1) = 1;
       n = 2 return m(2) = 1*2 = 2
       n = 3 return m(3) = 1*2*3 = 6
       n = 4 return m(4) = 1*2*3 *4 = 24

       n = 5 return m(5) = 24*5 = 120;

 步骤2:上面的规律实际上可以看出:
      n = 1 return m(1) = 1;
      n = 2 return m(2) = m(1)*2 
      n = 3 return m(3) = m(2)*3 
      n = 4 return m(4) = m(3)*4

      ...

 步骤3:得出 n = n return m(n) = m(n-1)*n; 
 步骤4:写出函数:
      void method(int n)
      {
            if(n == 1)
            {return 1;}
            else
            {
               return method(n-1)*n;
            }
      }

    上面递归的运行过程是,当输入n的时候,递归开始找出口。从n,n-1,n-2,n-3....1递减运行,直到n = 1,得到结果m(1) = 1;这个就是递归函数的出口。

    得到出口m(1) = 1后,递归函数又从n = 2,3,4,5,6...n递增运行,得出m(2),m(3),(4)的值。最后每个值相加。得出最终的结果。

二、斐波那契数列(兔子问题)

    当n = 1,m(1) = 1; n = 2 ,m(2) = 2;

    n>2时

    m(n) = m(n-1)+m(n-2);

   转换为递归函数是

  public static int method(int n)
{
if(n == 1)
return 1;
if(n == 2)
return 2;

return method(n-1)+method(n-2);

}

在这里通过枚举10到1得出的数据如下:

/* n = 10 re m9+m8;  89
 * n = 9   re m8+m7;  55
 * n = 8   re m7+m6;  34 
 * n = 7   re m6+m5;  21
 * n = 6   re m5+m4;  13
 * n = 5   re m4+m3;    8
 * n = 4;  re m3+m2;    5
 * n = 3   re m2+m1;    3
 * n = 2   re m2 = 2
 * n = 1   re m1 = 1
 */

同理,n从n-1,n-2,n-3...直到2,1,得出m1 = 1,m2 = 2;

然后   n从1,2,3,4...直到n 算出 m1,m2,m3,m4...m(n)的值。

    通过以上的算法可以算出看出递归的运行机制。并且在性能上面消耗还是比较打的。遍历了2n次。但是方法简便。


二、递归的应用。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值