递归地反转扫描仪输入的数字_order_

时间:2017-08-30 10:32:52

标签: java recursion java.util.scanner

我在尝试解决递归任务时遇到了麻烦,并且没有成功。

作业的目标是调用函数

reverseNumbers(new Scanner("11 23 31 49 56 611"))

并获取输出

"611 56 49 31 23 11"

虽然不允许使用数组,列表,字符串和方法应该只声明一个变量。

我写的代码不起作用。我收到StackOverflow错误,我明白为什么会这样。这是因为参数scan没有改变,并且它必须使递归起作用。但是,我不知道如何使用Scanner实用程序中提供的工具更改输入参数。

public static String reverseNumbers(Scanner scan){
   if (!scan.hasNext()) {
      return "";
   }
   else {
      return reverseNumbers(scan)  + " " + scan.nextInt();
   }
}

1 个答案:

答案 0 :(得分:5)

问题是您在从扫描仪读取数字之前正在递归。

请记住Java evaluates operands left-to-right。因此,它会在reverseNumbers(scan)之前评估scan.nextInt()

这意味着它会继续:

  • 看到scan.hasNext()
  • 致电reverseNumbers
  • 看到scan.hasNext()
  • 致电reverseNumbers
  • 看到scan.hasNext()
  • 致电reverseNumbers
  • ...

在进行递归调用之前评估scan.hasNext()

int next = scan.nextInt();
return reverseNumbers(scan) + " " + next;

现在,您正在消耗您使用hasNext()检测到的价值(顺便说一下应该是hasNextInt();或者使用String next = scan.next()),所以您检测到扫描仪的值"有"再也找不到了。