将递归方法更改为迭代方法

时间:2012-07-30 16:08:19

标签: java recursion

我有rerusive功能,工作正常。问题是,当行数很大时,它会产生stackoverflow错误。我想把它放在迭代中,可能使用for循环。这样做需要一些帮助。

private TreeSet validate(int curLine, TreeSet errorSet) {
    int increment = 0;
    int nextLine = 0;

    if (curLine == lines.length || errorSet.size() != 0) {
        return errorSet;
    } else {
        String line = lines[curLine];

        //validation starts.  After validation, line is incremented as per the requirements

        increment = 1 //As per requirement. Depends on validation results of the line

        if (increment > 0) {
            try{
                Thread.currentThread().sleep(100);  
            }catch(Exception ex){
                System.out.println(ex); 
            }
            nextLine = (curLine + increment);
            validate(nextLine, errorSet);
        }
    }

    return errorSet;
} 

海报对方法的描述:

该方法确实验证了文本行,如果该行有效,这些行具有必须跳过多少行的指令。因此,如果该行有效,将使用增量跳过许多行。如果该行无效,则增量将为0.

3 个答案:

答案 0 :(得分:2)

我不确定为什么这首先是递归的。这非常适合使用FOR循环。使用类似的东西:

private TreeSet validate(int curLine, TreeSet errorSet) { 
   int increment = 0;

   if (errorSet.size() != 0)
      return errorSet;

   for (int curLine = 0; curLine < lines.Length; curLine += increment)
   {
      // put your processing logic in here


      // set the proper increment here.
   }
}

如果增量始终为1,那么您可以使用curr++代替curLine += increment

答案 1 :(得分:1)

for(String line : lines) {
  // validate line here

  if(!errorSet.isEmpty()) {
    break;
  }
}

答案 2 :(得分:1)

您的问题的解决方案可以简单地循环或while,具有停止条件的逻辑表达式。通常,当我们必须通过Iterable或array的所有元素时,我们使用for循环。如果我们不知道我们要做多少循环,我们使用while循环。 for循环的优点是,我们免费拥有本地化变量,因此我们不会在循环中使用它们,因此我们减少了出现一些错误的可能性。

你的问题是你必须在两个条件下破解程序:

  1. 当errorSet不为空时。
  2. 当行数组不再有项目时。
  3. 作为矛盾,我们可以说你的计划应该继续:

    1. 直到errorSet为空,
    2. 并且直到行号小于存储它们的数组大小。
    3. 这为我们提供了简单的表达

      1. errorSet.isEmpty()
      2. lineNumber < lines.length()
      3. 我们可以使用逻辑运算符&&将它们组合起来,并在for循环中用作停止规则。

        for(int lineNumber= 0; errorSet.isEmpty() && lineNumber< lines.length(); lineNumber++)  {
        
           //code to operate
        
        }
        

        注意:

        通常,逻辑表达式使用运算符&&,以确保计算逻辑表达式的每个部分。另一种选择是&,如果是假,则不会运行更长时间并返回false。我们可能想要使用这个运算符来表达这个表达式,但我不错。因为当我们遍历所有没有错误代码的行时会产生IndexOutOfBoundException,如果我们切换位置,那么我们将不会进行任何优化,因为第一个表达式将被评估相同的次数。