目标:使用递归以相反的顺序打印文件行。
这是我的两个实现 - printReverse0
和printReverse1
。
正如您所看到的那样,唯一的区别是将input.nextLine()
存储在局部变量String line中,这样就可以在每个递归调用的每个堆栈中存储每一行,并在printReverse1中冒泡时打印它。
但是,我预计printReverse0也会工作,即使我没有将每一行显式存储在局部变量“line”中 由于每次递归调用,都会存储方法参数中的输入 在每个激活记录中。因此,当冒泡时,它可以使用存储在每个激活记录中的扫描仪输入来打印每一行。
但我意识到它不会进入下一行,因为printReverse0在调用递归方法之前没有使用input.nextLine();
移动到下一行。这意味着当递归方法的参数是数组及其索引 - input.nextLine()
时,void method( int[] arr, int index )
表现得像i + 1一样转到数组中的下一个元素。
这意味着printReverse1中的String line = input.nextLine()
设置为下一行的开头,并将当前行存储在堆栈中。所以没有它,它不会转到下一行,只是指向第一行导致堆栈溢出==>我理解正确吗?
import java.util.*;
import java.io.*;
public class PrintReverseFile_Rec
{
static void printReverse0( Scanner input ) {
if( input.hasNextLine() ) {
printReverse0( input ); // stack overflow here!!!
System.out.println( input.nextLine() );
}
return;
}
static void printReverse1( Scanner input ) {
if( input.hasNextLine() ) {
String line = input.nextLine();
printReverse1( input );
System.out.println( line );
}
return;
}
public static void main( String[] args ) {
File file = new File( "test.txt" );
Scanner input = null;
try {
input = new Scanner( file );
} catch( Exception e ) {}
printReverse0( input );
//printReverse1( input );
}
}
答案 0 :(得分:0)
是。据我所知,你的理解是正确的。 printReverse0
方法将永远不会退出递归,因为hasNext
调用将始终为true,这将导致堆栈溢出。