回傳值

極為常見

return 的用法

在之前的章節你已經學會了如何撰寫函式的功能,但計算完的數值總要存下來或回傳吧! return 這個語法的意思就是「回傳並離開函式」,他可以把參數回傳給原先呼叫函式的位置,同時結束函式的執行。也就是說 return 後的程式碼都不會被執行。

int apcs_level(int x) { // 一個自訂函式
    return x; // 返回變數 x
}

不過這邊要注意,return 回傳的型態要跟函式宣告的型態一致,否則會導致編譯錯誤。在這個例子中,函式 apcs_level 宣告的型態是 int,所以 return 後面的變數也要是 int 型態。

一個函式中可以有很多 return 敘述句,但只會有一個被成功執行。像是下面的例子,會依據不同的數值範圍返回不同的數值,每一種返回值都可以是一個 return 敘述句,但只有第一個被執行到的會生效,執行後就跳出函式不會執行其他程式碼。

int apcs_level(int);

int main() {
    apcs_level(150); // 傳遞的實作題分數
}

int apcs_level(int x) { // 接收分數的變數 s
    if (0 <= x && x < 50) return 1;
    if (50 <= x && x < 150) return 2;
    if (150 <= x && x < 250) return 3;
    if (250 <= x && x < 350) return 4;
    if (350 <= x && x <= 400) return 5;
    return -1;
}

接收回傳值

回傳的型態是在宣告函式時決定的,所以我們接受後若要進行運算或儲存就需要遵守對應的型態規則。我們假設有一個陣列用來儲存每次 APCS 考試的級分,我們可以這樣寫 :

int apcs[10];

int main() {
    for (int i = 0; i < 10; i++) {
        apcs[i] = apcs_level(150); // 將分數轉成級數
    }
}

我們可以想像程式執行完函式後會將函式替換成一個數值,接這就跟處理數值一樣賦值給 apcs 陣列進行儲存。當然也可以進行運算,這些都是依照題目需求去寫即可。

以下面這個例子來說:

int main() {
    cout << apcs_level(150) << endl;
}

呼叫完函式後,就相當於將函式替換成一個數值:

int main() {
    cout << 3 << endl;
}

遞迴函式

遞迴是程式中一個重要的概念,主要是函是自我呼叫產生的。常用來解決帶有一定規則的題目,而觀念題也時常出現遞迴的計算。

int gcd(int x, int y) {
    if (y == 0)
        return x;
    else
        return gcd(y, x % y);
}

上面是一個計算最大公因數的遞迴函式,函式 gcd 會再次呼叫 gcd 的自我呼叫過程稱作遞迴。由於使用到遞迴的演算法許多都較深奧,因此這邊只需要知道這個概念即可,各種實際的應用會在之後更進階的章節提及。

小測驗

如果只呼叫一次函式,該函式最多可以執行幾次 return 語句?