-2

通常我会按照以下方式执行我的代码以进行验证:

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
    }
}

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

4

5 回答 5

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实例,并将继续平稳运行,直到输入一些有效值。

当满足这些条件时,继续递归:

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

循环的性能通常也更好,但如果你使用递归,你应该在大多数时候遇到堆栈溢出,然后再注意到显着的性能损失。

于 2013-09-06T12:04:05.640 回答
1

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

  1. 您在此方法中声明了一个新对象。想想内存!
  2. 在这种情况下,while 循环会做得更好

编辑://减慢

于 2013-09-06T12:04:57.990 回答
0

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

于 2013-09-06T12:12:32.697 回答
0

使用递归算法的要点与其说是调用自身的方法,不如说是一种将一些结果返回给自身以供进一步处理的方法:有一个调用堆栈正在建立,但在某个深度(希望如此)recusion 终止并将结果传回堆栈以生成一些最终结果。

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

于 2013-09-06T12:13:46.483 回答
-2

循环总是比递归好。在递归中,内部堆栈被建立起来。递归还需要一个比循环慢的方法子例程跳转

于 2013-09-06T12:04:51.070 回答