Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中使用递归的影响_Java_Algorithm_Data Structures_Recursion - Fatal编程技术网

在Java中使用递归的影响

在Java中使用递归的影响,java,algorithm,data-structures,recursion,Java,Algorithm,Data Structures,Recursion,我已经编写了一个示例Java类,并在一个方法中为特定目的使用了递归。我在下面展示了特定递归方法的代码(请注意,我在这里只提到了该方法所需的部分) 如果有人能帮助我了解在java程序中使用递归的影响,以及这是一种好的做法还是一种坏的做法,我将不胜感激。如果这是一种不好的做法,那么负面影响是什么。递归本身并不坏,事实上它通常是设计算法的最佳方式 也就是说,在你的情况下,我会说这是糟糕的设计。实际上,您有一个while循环,它是通过递归实现的 这可能有几个问题: 可读性和代码维护。这是一个循环,为什

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


如果有人能帮助我了解在java程序中使用递归的影响,以及这是一种好的做法还是一种坏的做法,我将不胜感激。如果这是一种不好的做法,那么负面影响是什么。

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

也就是说,在你的情况下,我会说这是糟糕的设计。实际上,您有一个
while
循环,它是通过递归实现的

这可能有几个问题:

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

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

      也就是说,在你的情况下,我会说这是糟糕的设计。实际上,您有一个
      while
      循环,它是通过递归实现的

      这可能有几个问题:

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


      递归的唯一阴暗面是,如果函数多次调用自身(可以使用JVM参数修改堆栈大小),则可能会得到StackOverflowException。请注意,递归可能总是被一个简单的while循环所取代。

      递归唯一不好的一面是,如果您的函数将多次调用自身(您可以使用JVM参数修改堆栈大小),则可能会得到StackOverflowException。请注意,递归可能总是被一个简单的while循环所取代。

      递归本身并不坏,但您似乎是在一个进行DB调用的方法上使用它,而这个方法实际上并不能产生良好的共鸣,IMHO。这通常取决于递归的深度。实现一个迭代算法并比较执行时间。@RJ-DB调用如何影响递归??。据我所知,这堆文件不应该编号过多。DB调用在时间上是昂贵的,在递归中,我们不会因为时间限制而出错,我们会因为空间限制而出错。如果我错了,请纠正我。thanksRecursion本身并不坏,但您似乎在一个进行DB调用的方法上使用它,而这实际上并没有给人良好的感觉,IMHO。它通常取决于递归的深度。实现一个迭代算法并比较执行时间。@RJ-DB调用如何影响递归??。据我所知,这堆文件不应该编号过多。DB调用在时间上是昂贵的,在递归中,我们不会因为时间限制而出错,我们会因为空间限制而出错。如果我错了,请纠正我。thanksRecursion可能总是被循环所取代,但它并不总是一个简单的循环。它可能变得非常复杂。哈哈,这取决于你所说的简单和复杂。每个递归函数都必须有一个退出条件,它总是可以在不定式循环中实现为
      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);
              }