2010-01-23 76 views
1

在我的課本從輸入倒車線,有這種例子非常相似這扭轉從輸入文件中的一行:使用遞歸函數

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號線的條件語句成爲自第一(myInput =「\ n」!)是假的假,第二部分(myInput!= EOF)是真的,使整行爲假,而不是再次調用Reverse函數?謝謝。

回答

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

if第4行語句將排除新行和文件 條件結束。這是 什麼原因導致遞歸只從文件中讀取一行。

1

該行是遞歸的基礎條件。顯然,這個功能被設計爲一次從輸入文件反向打印一行。因此,一旦遇到\nEOF,它已達到當前行的末尾,因此不會繼續進一步。重複撥打Reverse打印出連續的行。

0

你是對的。當字符是'\ n'時它不會調用Reverse()。所以這隻會顛倒文件的第一行。