数据结构与算法之递归

╰半夏微凉° 2024-04-17 05:59 153阅读 0赞

简介

递归就是方法自己调用自己,每次调用时传入不同的参数,递归有助于解决复杂的问题,同时也能使代码变得简洁。

递归调用机制

有编程的基础的同学,应该知道递归的写法,下面我将使用两个小案例来分析递归的调用机制。

案例一 递归打印数字:

  1. public static void main(String[] args) {
  2. testRecursion(5);
  3. }
  4. public static void testRecursion(int n) {
  5. if (n > 2) {
  6. testRecursion(n - 1);
  7. }
  8. System.out.println("n=" + n);
  9. }

输出结果:

  1. n=2
  2. n=3
  3. n=4
  4. n=5

递归打印数字流程示意图:
在这里插入图片描述
流程分析:

  1. 当递归方法调用自己时,就会在栈中开辟一个独立的空间;
  2. 每个空间的基本数据类型变量,是独立的,互不影响,如果变量是引用类型,则会指向同一个内存地址;
  3. 递归调用时,直到方法执行完毕,或者遇到return语句,才会结束;
  4. 上述案例,main方法调用testRecursion传入参数n=5,当n大于2时,会递归调用testRecursion。当递归到n不大于2时,会依次执行递归调用后面的语句,此处是System.out.println("n=" + n)。直到方法执行完毕。

案例二 递归计算阶乘:

  1. public static void main(String[] args) {
  2. int factorial = factorial(3);
  3. System.out.println("factorial=" + factorial);
  4. }
  5. public static int factorial(int n) {
  6. if (n == 1) {
  7. return n;
  8. } else {
  9. return factorial((n - 1)) * n;
  10. }
  11. }

输出结果:

  1. factorial=6

递归使用场景

  1. 可用于解决各种数学问题,例如:汉诺塔、阶乘、迷宫回溯等;
  2. 应用到算法中,例如:快速排序、归并排序、二分查找、粉质算法等;
  3. 遇到复杂的数据结构时,可使用递归,可使代码更简洁;

递归需要遵守的规则

  1. 执行一个方法时,就创建了一个新的,受保护的独立空间,也就是栈;
  2. 方法的局部变量是独立的,不会相互受到影响,例如上面演示的案例所用到的参数n,只针对基本数据类型;
  3. 如果方法中使用的是引用类型的变量,就会共享该引用类型的数据;
  4. 递归方法必须要有退出的条件,否则就会出现无限递归,最终抛出StackOverflowError异常;
  5. 当一个方法执行完毕,或者遇到return语句,就会返回结果,遵守谁调用就会将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕;

发表评论

表情:
评论列表 (有 0 条评论,153人围观)

还没有评论,来说两句吧...

相关阅读

    相关 数据结构算法——学习

    可能很多人在大一的时候,就已经接触了递归了,不过,我敢保证很多人初学者刚开始接触递归的时候,是一脸懵逼的,我当初也是,给我的感觉就是,递归太神奇了! 可能也有一大部分人知道递

    相关 数据结构算法简述 算法

    递归就是函数(方法)不断调用自身,直到得到想要的结果。 其思路是把一个大问题转化为规模很小的子问题,这些子问题性质一样,可以采用同一种方式处理,通过解决小问题来达到解决大问题

    相关 算法数据结构

    一、什么是递归 递归是一种解决问题的方法,将问题分解为更小的子问题,直到得到一个足够小的问题可以 被很简单的解决。通常递归涉及函数调用自身。递归允许我们编写优雅的解决方案,