Java递归更好的方法?

时间:2013-09-06 12:00:58

标签: java

通常我会按照此行进行验证:

public static void Menu()
{
    Scanner keyboard = new Scanner(System.in);
    if (!keyboard.hasNextInt())
    {
        System.out.println("Incorrect input, try again");
        Menu();
    }  
    else
    {
        // switch statement etc
    }
}

我只是想知道这是一种不好的做法吗?如果是这样的话,为什么以及除了使用递归之外还有什么更好的方法。我已经使用递归来获得数字和其他一些东西的力量,所以我理解它的想法。

5 个答案:

答案 0 :(得分:9)

这是递归,在这种情况下这是一个不好的做法,因为如果您输入的错误数据太多次,您将以堆栈溢出异常结束。请尝试while循环:

  Scanner scanner = new Scanner(System.in);

  int choice = 0;

  while (scanner.hasNext()) {
     if(scanner.hasNextInt()) {
         choice = scanner.nextInt();
         break;
     }

     System.out.println("Incorrect input, try again");
     scanner.next();
  }

  scanner.close();

  // switch statement etc
  switch(choice) {
      //...
  }

这将只创建一个Scanner实例,并且会一直运行,直到输入一些有效值。

在满足这些条件的情况下保持递归:

  • 如果它增加了代码可读性/可维护性
  • 如果没有堆栈溢出的风险(你知道递归代码的执行次数不会超过有限次数)

循环的性能通常也更好,但是如果你使用递归,你应该在发现重大性能损失之前很久就应该满足堆栈溢出。

答案 1 :(得分:1)

在这种情况下,我会说是。

  1. 您在此方法中声明了一个新对象。想想记忆!
  2. 在这种情况下,while循环可以做得更好
  3. 编辑://慢化

答案 2 :(得分:0)

当递归调用的数量未修复时,这种类型的递归很糟糕。经过一些错误的尝试后,您可能会遇到OutOfMemoryError异常。所以最好找一个替代方案,或者如果你必须像这样使用递归,那么放一个允许你尝试一定次数的counter

答案 3 :(得分:0)

关于使用递归算法的要点不是调用自身的方法,而是更像是将一些结果返回给自身以进行进一步处理的方法:有一个调用堆栈正在构建但在某种程度上(希望如此) recusion终止,结果传回堆栈以生成最终结果。

你的例子只是通过反复调用Menu()来构建一个调用堆栈,但是没有传回结果,所以在我看来这根本不是正确的递归,但它只会填满你的堆栈无用的混乱。

答案 4 :(得分:-2)

循环总是比递归更好。在递归中,内部堆栈被构建。 递归也需要一个方法子例程跳转,它比循环