什麼是遞回函數

2020-07-16 10:04:43
前面的學習過程中,我們已經看到過很多呼叫其他函數的函數範例。例如,函數 A 可以呼叫函數 B,而函數 B 又可以呼叫函數 C。

實際上,函數也可以呼叫它自己。呼叫自己的函數稱為遞回函數。來看以下 message 函數:
void message()
{
    cout << "This is a recursive function. n";
    message();
}
該函數顯示字串 "This is a recursive function.",然後呼叫它自己。每次它呼叫自己時,迴圈都會重複。現在應該能發現該函數的問題,因為它沒有辦法停止遞回呼叫。這個函數就像一個無限迴圈,因為沒有程式碼阻止它重複。

要使遞回函數有用,則遞回函數必須有一個方法來控制遞回呼叫的次數。以下是對 message 函數的修改。它傳遞了一個整數引數,該引數將儲存函數呼叫自己的次數。
void message(int times)
{
    if (times > 0)
    {
        cout << "This is a recursive function.n";
        message(times - 1);
    }
}
該函數包含一個控制遞回的 if 語句。只要 times 引數大於零,它將顯示訊息並再次呼叫自己。每次它呼叫自己時,都會傳遞 times-1 作為引數。例如,假設有一個程式使用以下語句來呼叫該函數:

message(3);

引數 3 將導致函數被呼叫 4 次。第一次呼叫函數時,if 語句將顯示訊息並以 2 作為引數呼叫自身,如圖 1 所示。


圖 1 遞回函數呼叫過程