开发者

Reversing line from an input using a recursive function

In my textbook, there is this example very similar this to reverse a line from an input file:

void Reverse(ifstream &inFile, int level) 
{
    in开发者_StackOverflow中文版t myInput = inFile.get();
    if (myInput != '\n' && myInput != EOF) // don't understand this, line 4
        Reverse(inFile, level);
    if (myInput != EOF)
        cout.put(myInput);
}

What I don't get is the line I commented. Because from an input file that's inputs were:

ABC\n
DEF\0

When the \n is equal to myInput, doesn't it make line 4's conditional statement become false since the first (myInput != '\n') would be false, and the second part (myInput != EOF) be true making that whole line false, and not calling the Reverse function again? Thanks.


The trick to understanding recursion on a very basic level is to trace the execution and write out the sequence of calls. The following might help you to understand how this works. I indented each call to Recurse() and included the line numbers that are executed.

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

So this will output '\nCBA'.

As for the logic in the base condition, remember 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))

The if statement on line 4 will exclude newlines and the end of file condition so the recursion stops when it encounters either condition. This is what causes the recursion to only read one line from the file.


That line is the recursion's base condition. Apparently, this function is designed to print out one line in reverse from the input file at a time. So, once it encounters a \n or an EOF, it has reached the end of the current line, and so does not continue further. Repeated calls to Reverse print out successive lines.


You're right. It won't call Reverse() when the character is a '\n'. So this will only reverse the first line of a file.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜