如何递归地做同样的事情并仍然使用扫描仪和集合?
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
。在递归情况下将打印下一个元素,并进行后续递归调用。
因此,为了能够使用 Scanner
和 Queue
,您可以将它们作为参数传递或使它们在全球范围内可访问。
由于本次任务的需要,Scanner
和Queue
在方法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
这是我使用集合和扫描仪参数创建的代码。我一直很困惑将它组合成递归,我使用了迭代。
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
。在递归情况下将打印下一个元素,并进行后续递归调用。
因此,为了能够使用 Scanner
和 Queue
,您可以将它们作为参数传递或使它们在全球范围内可访问。
由于本次任务的需要,Scanner
和Queue
在方法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