在我的教科书中,有一个非常类似的例子来反转输入文件中的一行:
void Reverse(ifstream &inFile, int level)
{
int myInput = inFile.get();
if (myInput != '\n' && myInput != EOF) // don't understand this, line 4
Reverse(inFile, level);
if (myInput != EOF)
cout.put(myInput);
}
我没有得到的是我评论的那一行。因为来自输入文件的输入是:
ABC\n
DEF\0
当\ n等于myInput时,不会使第4行的条件语句变为false,因为第一个(myInput!='\ n')将为false,第二个部分(myInput!= EOF)为是真的使整行失败,而不是再次调用Reverse函数?感谢。
答案 0 :(得分:1)
该行是递归的基本条件。显然,此功能旨在一次从输入文件中反向打印一行。因此,一旦遇到\n
或EOF
,它就会到达当前行的末尾,因此不会继续进行。重复调用Reverse
打印出连续的行。
答案 1 :(得分:1)
在最基本的层面上理解递归的技巧是追踪
执行并写出调用序列。以下内容对您有所帮助
了解这是如何工作的。我缩进了对Recurse()
的每次调用
包括执行的行号。
3: myInput = 'A'
5: Reverse()
3: myInput = 'B'
5: Reverse()
3: myInput = 'C'
5: Recurse()
3: myInput = '\n' <<<< base condition, recursion stops here
7: cout.put('\n')
7: cout.put('C')
7: cout.put('B')
7: cout.put('A')
所以这将输出'\ nCBA'。
至于基本条件中的逻辑,请记住De Morgan's Laws:
(NOT P) AND (NOT Q)
-> NOT (P OR Q)
(myInput != '\n') && (myInput != EOF)
-> (!(myInput == '\n')) && (!(myInput == EOF))
-> !((myInput == '\n') || (myInput == EOF))
第4行的if
语句将排除换行符和文件结尾
条件使得递归在遇到任何一个条件时停止。这是
是什么导致递归只读取文件中的一行。
答案 2 :(得分:0)