如何递归地做同样的事情并仍然使用扫描仪和集合?

How to do the the same thing recursively and still using Scanner and a Collection?

这是我使用集合和扫描仪参数创建的代码。我一直很困惑将它组合成递归,我使用了迭代。

public class Main {
  public static void main(String[] args) {
    Deque deque = new LinkedList<>();

    Scanner sc = new Scanner(System.in);
    System.out.println("Enter your words (type R to reverse):");

    while(sc.hasNext()) {
      String line = sc.next();
      if(line.toLowerCase().equals("r")) {
        break;
      }
      deque.add(line);
    }

    System.out.println("\n===== Reversed Lines =====\n");        

    Iterator reverse = deque.descendingIterator();
    while (reverse.hasNext()) {
      System.out.println(reverse.next());
    }
  }
}

首先,快速回顾一下递归

每个递归方法由两部分组成:

  • 基本情况 - 表示一个简单的edge-case(递归终止时的条件),其结果是预先知道的。
  • 递归案例 - 解决方案的一部分,其中进行了递归调用并且主要逻辑 居住。

您可以将负责读取 用户输入 的代码提取到单独的方法中,并将 while 循环替换为递归调用。

基本情况 由两种情况表示:sc.hasNext() 产生 false 并且用户输入等于 "r"。否则,该行将被添加到队列并进行新的递归调用。

打印队列中的内容也可以递归完成。此方法的 基本情况 reverse.hasNext() returns false。在递归情况下将打印下一个元素,并进行后续递归调用。

因此,为了能够使用 ScannerQueue,您可以将它们作为参数传递或使它们在全球范围内可访问。

由于本次任务的需要,ScannerQueue在方法readAndPrint()内部局部声明,作为方法readInput().[=24的参数=]

public class Main {

    public void readAndPrint() {
        Scanner sc = new Scanner(System.in);
        Deque<String> deque = new LinkedList<>();
        System.out.println("Enter your words (type R to reverse):");
        readInput(sc, deque); // recursive helper-method that read from the console

        System.out.println("\n===== Reversed Lines =====\n");
        print(deque.descendingIterator()); // recursive helper-method that prints to the console
    }

    public static void print(Iterator<String> reverse) {
        if (!reverse.hasNext()) { // base case
            return;
        }

        System.out.println(reverse.next());
        print(reverse); // recursive call
    }

    public void readInput(Scanner sc, Deque<String> deque) {
        if (!sc.hasNext() && sc.hasNextLine()) { // no more input on this line, but there's at least one more line
            sc.nextLine(); // advance to the next line
        }
        if (!sc.hasNext()) { // base case
            return;
        }
        String line = sc.next();
        if (line.equalsIgnoreCase("r")) { // base case
            return;
        }
        deque.add(line);
        readInput(sc, deque); // recursive call
    }
    
    public static void main(String[] args) {
        ri.readAndPrint();
    }
}

输出

Humpty Dumpty    // multyline input
sat on a wall R

===== Reversed Lines =====

wall
a
on
sat
Dumpty
Humpty