初体验递归

记得之前学递归总是没有一点感觉,今天在复习流的是否插播了一段递归,突然感觉茅塞顿开,哈哈哈哈,记录这欢喜的一刻。

「递归 recursion」是一种算法策略,通过函数调用自身来解决问题。它主要包含两个阶段。

  1. :程序不断深入地调用自身,通常传入更小或更简化的参数,直到达到“终止条件”。
  2. :触发“终止条件”后,程序从最深层的递归函数开始逐层返回,汇聚每一层的结果。

1、不死神兔问题

每个月的兔子对数,从第3个月开始,之后的每个月的兔子对数是前2个月兔子数的和;

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

2、计算i的阶乘

1!= 1

2!= 1*2

3!=1*2*3...... 等等依次类推下去

public static void main(String[] args) {
            /**
             * 不死神兔问题
             */
            int rabbitCount = getRabbitCount(20);
            System.out.println(rabbitCount);
            /**
             * 计算阶乘
             */
            int i = getJC(5);
            System.out.println(i);


        }

        public static int getRabbitCount(int i){
            if (i == 1 || i == 2){
                return 1;
            }else {
                return getRabbitCount(i - 1) + getRabbitCount(i -2);
            }
        }

        public static int getJC(int n){
            if (n == 1){
                return 1;
            }else {
                return n * getJC(n - 1);
            }
        }

递归小心得,不管多么复杂的问题,只要有出口就可以将大量的运算交给计算机去算,但是一定要有限度,也就是最后程序要能够返回,不然容易堆调用过深出现异常StackOverflowError。

在此,对比一下for/while(迭代)和递归

虽然从计算角度看,迭代与递归可以得到相同的结果,但它们代表了两种完全不同的思考和解决问题的范式

  • 迭代:“自下而上”地解决问题。从最基础的步骤开始,然后不断重复或累加这些步骤,直到任务完成。
  • 递归:“自上而下”地解决问题。将原问题分解为更小的子问题,这些子问题和原问题具有相同的形式。接下来将子问题继续分解为更小的子问题,直到基本情况时停止(基本情况的解是已知的)。

以上述的求和函数为例,设问题 F(n)=1+2+⋯+n 。

  • 迭代:在循环中模拟求和过程,从 1 遍历到 n ,每轮执行求和操作,即可求得 F(n) 。
  • 递归:将问题分解为子问题 F(n)=n+F(n−1) ,不断(递归地)分解下去,直至基本情况 F(1)=1 时终止。

谁能凭爱意要富士山私有~

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值