递归的简单应用——Fibonacci和阶乘

本文深入探讨了递归的基本概念,解析其工作原理,并通过斐波拉契数列和阶乘问题展示了递归的实际应用。文章强调了递归条件的重要性,避免无限循环,确保算法的有效性和正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

递归

函数自己调用自己的一个过程。在解决一个数量级较大的问题时,通常将量级降低,分成多个子问题,由小到大解决问题。符合我国古话所说的“大事化小”的一个原则。

递归条件
  1. 子问题须与原始问题为同样的事,且更为简单;
  2. 不能无限制地调用本身,要有个出口,简化为非递归情况处理,否则会出现死循环的问题,如:
    public static void test(){
        System.out.println("1");
        test();
    }
递归的简单应用
斐波拉契
    public static int fibo(int num){
    	// 首先判断传入参数是否为大于0的数
        if (num >= 0){
        	// 当num = 0时 则返回0
            if (num == 0){
                return 0;
            // 当num = 1时,返回1
            }else if (num == 1){
                return 1;
            // 当num > 1时,进行函数本身自调用将问题细分为几个子问题
            }else {
                return fibo(num - 1) + fibo(num - 2);
            }
        }else {
            return -1;
        }
    }

斐波拉契数列问题递归的出口为num = 0或num = 1。

阶乘
    public static int factorial(int num){
    	// 当传入参数为负数时,返回-1进行参数错误的提醒
        if (num < 0){
            return -1;
        // 当参数为 0 时,返回0
        }else if (num == 0){
            return 0;
        // 当参数为 1 时,返回1。
        }else if (num == 1){
            return 1;
        // 当参数大于 1 时,返回num * factorial(num - 1),进行自调用
        }else {
            return num * factorial(num - 1);
        }
    }

递归出口为num = 1。

递归原理分析

当一个问题很大,一步不能计算出来的时候,我们就将这个问题细分为两个或多个子问题(子问题必须和原问题是同一个事),直到我们将问题细分为我们能直接解决的子问题为止,计算出能解决子问题后将答案返回到上一层,最终计算出原问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值