美文网首页
递归算法入门(Java)

递归算法入门(Java)

作者: LuckyBuzz | 来源:发表于2018-04-19 14:36 被阅读0次

今天学习了简单的递归算法,参考书籍为 Building Java Programs--A Back to Basics Approach (Stuart Reges | Marty Stepp, University of Washington)。

依书中所说,递归算法可以理解为普通迭代算法的另一种实现,其中:

Iteration (Iterative): A programming technique in which you describe actions to be repeated using a loop.

Recursion (Recursive): A programming technique in which you describe actions to be repeated using a method that calls itself.

实现方面,理论上任何一个普通的迭代算法都能够转化成递归的形式,例如打印星号算法:

public static void writeStars(int n) {        // 迭代实现
    for (int i = 1; i <= n; i++) {
        System.out.print("*");
    }
    System.out.println();
}
public static void writeStars(int n) {        // 递归实现
    if (n == 0) {
        System.out.println();
    } else {
        System.out.print("*");
        writeStars(n – 1);
    }
}

在对迭代实现进行改写时,个人认为只需要把握两个要点即可:
1、找到循环的一般实现单元
2、找到循环的跳出条件
书中将这两个要点称为:

Base Case: A case within a recursive solution that is so simple that it can be solved directly without a recursive call.

Recursive Case: A case within a recursive solution that involves reducing the overall problem to a simpler problem of the same kind that can be solved by a recursive call.

一个稍微复杂一点的递归实现例子是最大公约数求解算法(这里只考虑了部分情况,且输入参数 x > y)

public static int gcd(int x, int y) {
    if (x < 0 || y < 0) {
        // recursive case with negative value(s)
        return gcd(Math.abs(x), Math.abs(y));
    } else if (y == 0) {
        // base case with y == 0
        return x;
    } else {
        // recursive case with y > 0
        return gcd(y, x % y);
    }
}

然而,使用递归实现并不是在所有情况下都是最优的,它具备下列优缺点:
(转自https://blog.csdn.net/wangzhenling/article/details/59702845)

优点:表达简洁,实现简单,开发人员只需要考虑解决一个复杂问题所需的两个递归算法实现要素即可。

缺点:效率存疑,过深的方法调用堆栈会产生栈溢出等问题。

因此,结合实际情况进行考虑之后,只有在递归算法实现简单程度明显优于迭代算法时(树的前序,中序,后序遍历算法或者最短路径算法等)才需要考虑进行递归实现。普通的代码使用迭代实现不但没有效率损失,还可以增强可读性,不会被同事嫌弃。

相关文章

  • Java递归算法详解

    递归算法是一种直接或者间接调用自身函数或者方法的算法。Java递归算法是基于Java语言实现的递归算法。递归算法的...

  • 递归算法入门(Java)

    今天学习了简单的递归算法,参考书籍为 Building Java Programs--A Back to Basi...

  • 排序

    八大排序算法 一、归并排序 递归及非递归的JAVA实现 二、快速排序 快排算法JAVA实现 三、堆排序 堆排序堆排...

  • 快速幂模板

    递归算法 非递归算法

  • 全排列的非递归算法

    import java.util.Arrays; //全排列的非递归算法 public class FullPer...

  • python递归算法、尾递归算法及优化

    文章概述 递归算法和尾递归概述递归算法的优化 递归算法 介绍:递归算法是计算机编程领域非常重要的一种算法,采用分而...

  • C++ 递归算法

    递归算法,尾递归算法求阶乘!

  • 206. 反转链表

    使用头插法实现 2019.8.5----MJ数据结构与算法更新 1、Java递归 这个递归真的想了好久好久才想明白...

  • Java递归算法应用

    递归: 就是函数自身调用自身。什么时候用递归呢?当一个功能被重复使用,而每一次使用该功能时的参数不确定,都由上次的...

  • Java--递归算法

    递归不是循环,是方法的调用循环是正常执行的,循环是只产生一个方法空间;递归调用时会产生很多一样的临时空间,消耗内存...

网友评论

      本文标题:递归算法入门(Java)

      本文链接:https://www.haomeiwen.com/subject/kkjwkftx.html