好好理解 Java 中的递归

递归是一种强大的编程技巧,通过将大问题分解为小问题来解决。它包含两个关键条件:缩小问题规模并有递归出口。递归算法通常包括将问题分解、避免子问题重叠及设置终止条件。示例中展示了使用递归实现斐波那契数列和99乘法表。递归在解决特定类型问题时非常有效,尤其适合数据结构如树和图的遍历等任务。

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

递归的思想

把规模大的问题转化为规模小的相似的子问题来解决。在函数实现时,因为解决大问题的方法和解决小问题的方法往往是同一个方法,所以就产生了函数调用它自身的情况。另外这个解决问题的函数必须有明显的结束条件,这样就不会产生无限递归的情况了。

一句话总结:递归就是自己调用自己。

递归的条件要素

1、递归有两个重要条件,

  • 可以通过递归调用来缩小问题规模,且新问题与原问题有着相同的形式。(自身调用)
  • 存在一种简单情境,可以使递归在简单情境下退出。(递归出口)

2、递归的三要素,

  • 尝试将一个问题化简到更小的规模
  • 父问题与子问题不能有重叠的部分
  • 一定有一种可以退出程序的情况

递归的算法结构

递归的常用算法伪代码如下:

func( mode){
    if(endCondition){      //递归出口
          end;
    }else{
         func(mode_small)  //调用本身,递归
    }
}

递归实战举例

递归讲起来还是有点小抽象,我们直接来看代码,

1、斐波那契数的递归实现

斐波那契数列的递推公式:Fib(n)=Fib(n-1)+Fib(n-2),生成数列(1、1、2、3、5、8...)。

public static int fib(int n) throws Exception {
    if (n < 0){
        throw new Exception("请输入正确的参数");
	  } else if (n == 0 || n == 1){
        return n;
	  } else {
        return fib(n - 1) + fib(n - 2); // 调用自己
	  }
}

2、99乘法表的递归实现

public static void mul(int n){
        if(n==1){
            System.out.println("1*1=1");
        }else {
            mul(n -1);
            for(int i=1;i<=n;i++){
                System.out.println(i + "*" + n + "=" + i*n + " ");
            }
        }
    }

总结

递归算法是一种直接或间接地调用自身的算法。如果一个问题可以解可以分解为几个子问题的解; 这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样;并且存在明显的递归终止条件;那么递归将是一种不错的选择。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值