2009-01-19 62 views
1

開發-CPP配備了一個示例程序困境,它在它GetResults功能:遞歸用戶輸入 - 優雅還是奇怪?

void 
GetResults() 
{ 
    . 
    . 
    . 

    else if (i>j) 
    { 
     cout << "Too BIG\n"; 
     life = life - 1; // -1 to the user's "life" 
     cout << "Number of remaining life: " << life << "\n\n"; 
     GetResults(); 
    } 

這是反覆要求用戶輸入一個優雅的方式?當然,它比使用do-while循環包裝~20條線更具可讀性。我傾向於喜歡它,但我不經常看到這樣的事情,所以我不確定。你怎麼看?

編輯:在你的榜樣,遞歸深度是由生命的數量阻止,使看起來不錯,因爲這不會得到大於1000,甚至100 - 這就是爲什麼我已經考慮過,但現在我可以看到這是一個相當愚蠢的想法:)我不知道誰把這個在示例程序 ...

感謝您的輸入的傢伙!

回答

2

這肯定會導致堆棧溢出,所以不應該這樣做!取決於堆棧的大小,你可以做多少次,但肯定會崩潰。在你的例子中,遞歸深度被生命的數量所阻止,所以看起來好,因爲它不會超過1000甚至100,但是你不應該使用它。

我也不同意可讀性,因爲縮進有助於識別while循環內部的塊,但對於像這樣的任務,遞歸非常罕見,我認爲它經常會讓人們感到困惑。

1

這不是一個好方法,除非你想測試你的應用程序的堆棧大小。 ;)

1

不!壞!

這根本不是好設計。最好的方法是將其封裝在調用者的while循環中。 I.E.

int input = 0; 
while (GetInt(&input)) 
{ 
    if (input > something) 
    { 
     cout << "Too big"; 
     life--; 
    } 
    else 
     break; 
} 

有沒有想過什麼是StackOverflow?嘗試輸入一個數字太大的代碼寫的方式,你會發現:)