Recursion 使用递归函数从输入反转行
在我的教科书中,有一个非常类似于从输入文件中反转一行的示例:Recursion 使用递归函数从输入反转行,recursion,Recursion,在我的教科书中,有一个非常类似于从输入文件中反转一行的示例: 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
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)将为true使整行变为false,并且不再调用Reverse函数?谢谢。那一行是递归的基本条件。显然,此函数设计为一次从输入文件中反向打印一行。因此,一旦遇到
\n
或EOF
,它就到达了当前行的末尾,因此不再继续。重复调用Reverse
打印连续行 你说得对。当字符为“\n”时,它不会调用Reverse()。因此,这只会反转文件的第一行。在非常基本的层次上理解递归的诀窍是跟踪
执行并写出调用顺序。以下内容可能会对您有所帮助
了解这是如何工作的。我将每个调用缩进到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')
第4行的if
语句将排除换行符和文件结尾
条件,因此递归在遇到任何一个条件时停止。这是
是什么导致递归只从文件中读取一行
(NOT P) AND (NOT Q)
-> NOT (P OR Q)
(myInput != '\n') && (myInput != EOF)
-> (!(myInput == '\n')) && (!(myInput == EOF))
-> !((myInput == '\n') || (myInput == EOF))