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))