繁体   English   中英

在Java中使用递归的影响

[英]Impact of using recursions in Java

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

  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程序中使用递归的影响以及它是好习惯还是坏习惯,我将不胜感激。 如果这是一个不好的做法,那么负面影响是什么。

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

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

这可能有一些问题:

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

递归的唯一弊端是,如果函数将自己多次调用(您可以使用JVM参数修改堆栈大小),则可能会收到StackOverflowException。 请注意,递归始终可以用简单的while循环替换。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM