在Java中使用递归的影响
我已经编写了一个示例Java类,并在一个方法中为特定目的使用了递归。我在下面展示了特定递归方法的代码(请注意,我在这里只提到了该方法所需的部分)在Java中使用递归的影响,java,algorithm,data-structures,recursion,Java,Algorithm,Data Structures,Recursion,我已经编写了一个示例Java类,并在一个方法中为特定目的使用了递归。我在下面展示了特定递归方法的代码(请注意,我在这里只提到了该方法所需的部分) 如果有人能帮助我了解在java程序中使用递归的影响,以及这是一种好的做法还是一种坏的做法,我将不胜感激。如果这是一种不好的做法,那么负面影响是什么。递归本身并不坏,事实上它通常是设计算法的最佳方式 也就是说,在你的情况下,我会说这是糟糕的设计。实际上,您有一个while循环,它是通过递归实现的 这可能有几个问题: 可读性和代码维护。这是一个循环,为什
如果有人能帮助我了解在java程序中使用递归的影响,以及这是一种好的做法还是一种坏的做法,我将不胜感激。如果这是一种不好的做法,那么负面影响是什么。递归本身并不坏,事实上它通常是设计算法的最佳方式 也就是说,在你的情况下,我会说这是糟糕的设计。实际上,您有一个
while
循环,它是通过递归实现的
这可能有几个问题:
- 可读性和代码维护。这是一个循环,为什么要混淆它
- 易受堆栈溢出影响。递归调用采用与父级相同的参数,因此如果数据库不更改,则完全可能得到无限循环。这对于
循环来说非常好,但在您的情况下,它最终将达到堆栈限制并引发异常。这将使递归的使用成为一个bug,在我看来,它具有安全隐患(拒绝服务)while
- 这不适用于您的代码,但在一般情况下,函数调用比简单循环要昂贵得多。因此,如果将
循环的执行时间与while
循环的递归实现进行比较,就会发现性能差距很大。在某些情况下(即尾部递归),可以对此进行优化,但并不总是如此。(这种影响在代码中可以忽略不计,因为数据库查询远比函数调用开销昂贵)while
- 递归本身并不坏,事实上,它通常是设计算法的最佳方式
也就是说,在你的情况下,我会说这是糟糕的设计。实际上,您有一个
while
循环,它是通过递归实现的
这可能有几个问题:
- 可读性和代码维护。这是一个循环,为什么要混淆它
- 易受堆栈溢出影响。递归调用采用与父级相同的参数,因此如果数据库不更改,则完全可能得到无限循环。这对于
循环来说非常好,但在您的情况下,它最终将达到堆栈限制并引发异常。这将使递归的使用成为一个bug,在我看来,它具有安全隐患(拒绝服务)while
- 这不适用于您的代码,但在一般情况下,函数调用比简单循环要昂贵得多。因此,如果将
循环的执行时间与while
循环的递归实现进行比较,就会发现性能差距很大。在某些情况下(即尾部递归),可以对此进行优化,但并不总是如此。(这种影响在代码中可以忽略不计,因为数据库查询远比函数调用开销昂贵)while
if()break代码>递归函数可以在其堆栈帧中具有状态,该状态在递归返回后使用。现在我们来看一个递归函数,它在一次调用中多次调用自己并使用结果,然后尝试将其重写为一个迭代解决方案……只有结束递归才不需要重写。这很公平。但是,如果有几个递归方法的调用,您可能总是使用一些高级数据结构来实现相同的循环。我想说的唯一一件事是,递归可以转换为循环,以防您被迫这样做的深度太大。是的,这可能需要一些重构。这就是重点,“使用一些高级数据结构”不同于“替换为一个简单的while循环”。递归可能总是被一个循环替换,但它并不总是一个简单的循环。它可能变得非常复杂。哈哈,这取决于你所说的简单和复杂。每个递归函数都必须有一个exit con
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);
}