使用递归以相反的顺序打印文件的行 - 我理解正确吗?

时间:2015-07-07 11:28:18

标签: java file recursion

目标:使用递归以相反的顺序打印文件行。

这是我的两个实现 - printReverse0printReverse1。 正如您所看到的那样,唯一的区别是将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 );
    }
}

1 个答案:

答案 0 :(得分:0)

是。据我所知,你的理解是正确的。 printReverse0方法将永远不会退出递归,因为hasNext调用将始终为true,这将导致堆栈溢出。