在Java中使用递归的影响

时间:2013-11-20 08:55:48

标签: java algorithm data-structures recursion

我编写了一个示例Java类,并在方法中将recursion用于特定目的。我已经在下面显示了特定递归方法的代码(请注意,我在这里只提到了方法中所需的部分)。

  private String checkForDuplicateCVs(final Integer userId) throws SQLException {

       //
       // Codes to obtain the cvSerialId comes here...
       //

       final Integer cvCount = (Integer) getSqlMapClient().queryForObject("user.getCvCountBySerialId", cvSerialId);

        if (cvCount != 0) {
           checkForDuplicateCVs(userId);
        }

如果有人可以帮助我弄清楚在java程序中使用递归的影响以及这是一个好习惯还是坏习惯,我们将不胜感激。如果这是一个不好的做法那么负面影响是什么。

2 个答案:

答案 0 :(得分:3)

递归本身并不坏,实际上它通常是设计算法的最佳方式。

那就是说,在你的情况下,我会说这是糟糕的设计。你基本上有一个while循环,你用递归实现。

这有一些可能的问题:

  • 可读性和代码维护。这是一个循环,为什么要混淆它呢?
  • 易受堆栈溢出影响。您的递归调用采用与父项相同的参数,因此如果数据库没有更改,您将完全可能获得无限循环。这对于while循环来说非常好,但在你的情况下最终会达到堆栈限制并抛出异常。这会使你使用递归成为一个错误,我认为这个错误具有安全隐患(拒绝服务)。
  • 这不适用于您的代码,但通常函数调用比简单循环要昂贵得多。因此,如果比较while循环的执行时间和该while循环的递归实现,您将看到较大的性能差距。在某些情况下(即尾递归)可以优化它,但并非总是如此。 (这种影响在您的代码中可以忽略不计,因为数据库查询远比函数调用开销贵得多)

答案 1 :(得分:-2)

递归的唯一黑暗的一面是,如果你的函数会调用很多次(你可以用JVM参数修改堆栈大小),你可能会得到一个StackOverflowException。请注意,递归可能总是被简单的while循环替换。