使用递归函数从输入反转行

时间:2010-01-23 21:18:05

标签: 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)
        cout.put(myInput);
}

我没有得到的是我评论的那一行。因为来自输入文件的输入是:

ABC\n
DEF\0

当\ n等于myInput时,不会使第4行的条件语句变为false,因为第一个(myInput!='\ n')将为false,第二个部分(myInput!= EOF)为是真的使整行失败,而不是再次调用Reverse函数?感谢。

3 个答案:

答案 0 :(得分:1)

该行是递归的基本条件。显然,此功能旨在一次从输入文件中反向打印一行。因此,一旦遇到\nEOF,它就会到达当前行的末尾,因此不会继续进行。重复调用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)

你是对的。当字符为'\ n'时,它不会调用Reverse()。所以这只会反转文件的第一行。