09 関数の基礎

同じ処理を何度も書くのは非効率——それを解決するのが「関数」。

プログラムを書いていると、「同じ処理」が複数の場所に登場することがあります。 例えば「2つの数の大きい方を返す」処理を10か所に書いたとして、後から仕様が変わったら10か所全て直さなければなりません。

関数を使えば、処理に名前をつけて1か所にまとめておき、必要なときに呼び出すだけで済みます。 修正も1か所で完結します。

さらに関数は「この処理は何をするか」という意図を名前で表現できるため、プログラム全体が読みやすくなります。 大規模なプログラムほど、関数の設計が重要になります。

1. 関数の基本構造

○戻り値の型: 関数名(引数の型: 引数名, ...)
    処理
    return 戻り値
「関数」の目印 戻り値の型 関数名 ( 引数の型: 引数名, ... ) 返す値の型 関数の名前 受け取る値

具体例:2つの整数の和を返す関数

○整数型: add(整数型: a, 整数型: b)
    整数型: result
    result ← a + b
    return result

2. 関数の呼び出しと戻り値

関数は呼び出し元から引数を渡して実行し、戻り値を受け取ります。

呼び出し元 total ← add(3, 5) を実行 total に 8 が入る 引数 3, 5 を渡す 関数 add a=3, b=5 を受け取る result ← 3 + 5 return result → 8 を返す 戻り値 8 total = 8
整数型: total
total ← add(3, 5)   // total に 8 が代入される
total を出力         // 出力:8
return に到達すると、関数はその場で終了し、呼び出し元に戻り値を返します。 return より後ろに処理を書いても実行されません。

3. 戻り値のない関数(手続き)

値を返さない関数(処理だけ行う)は、戻り値の型の代わりに何も書かないか、または型名を省略します。

○ printDouble(整数型: x)
    整数型: result ← x * 2
    result を出力

呼び出し例:

printDouble(5)   // 10 を出力
printDouble(8)   // 16 を出力

4. 実行の流れをトレースする

複数の関数が呼び出される場合、呼び出された関数が終了してから呼び出し元に戻るのがポイントです。

○ 整数型: double(整数型: n)
    return n * 2

○ 整数型: quadruple(整数型: n)
    return double(double(n))   // double を2回呼ぶ

整数型: result ← quadruple(3)
result を出力
呼び出し 処理内容 戻り値 quadruple(3) を呼ぶ double(double(3)) を実行 —(処理中) └ double(3) を呼ぶ 3 * 2 を計算 6 を返す └ double(6) を呼ぶ 6 * 2 を計算 12 を返す result ← 12 quadruple(3) の結果 12 を出力

5. 理解度チェック問題

問題09-1

次の関数を add(4, 6) として呼び出したとき、戻り値はいくつか。

○整数型: add(整数型: a, 整数型: b)
    return a + b
解説を表示 正解:イ
a=4, b=6 が渡され、4 + 6 = 10 が返されます。

問題09-2

次のプログラムを実行したとき出力される値はどれか。

○整数型: square(整数型: n)
    return n * n

整数型: result ← square(5)
result を出力
解説を表示 正解:エ
square(5) → 5 * 5 = 25 が返され、result に代入されて出力されます。

問題09-3

次のプログラムを実行したとき出力される順番として正しいものはどれか。

○ proc1()
    "A" を出力する
    proc3()

○ proc2()
    proc3()
    "B" を出力する
    proc1()

○ proc3()
    "C" を出力する

proc2() を呼び出す
解説を表示 正解:ウ
① proc2 呼び出し → proc3() → "C" 出力
② proc3 終了、proc2 に戻る → "B" 出力
③ proc1() 呼び出し → "A" 出力
④ proc3() 呼び出し → "C" 出力
出力順:C → B → A → C

問題09-4 空欄補充

次の関数は2つの整数のうち大きい方を返す。空欄 [ A ] に入るものを選びなさい。

○整数型: maxOf(整数型: x, 整数型: y)
    if ( x が y より大きい )
        return x
    else
        [ A ]
    endif
解説を表示 正解:ア
x が y より大きくない(y が大きいか等しい)ときは y を返します。
return x にすると常に x が返り、出力では呼び出し元に値が戻りません。

問題09-5 空欄補充

次の関数は配列の要素の合計を返す。空欄 [ B ] に入るものを選びなさい。

○整数型: sumArray(整数型の配列: arr)
    整数型: i
    整数型: total ← 0
    for ( i を 1 から arr の要素数 まで 1 ずつ増やす )
        total ← total + arr[i]
    endfor
    [ B ]
解説を表示 正解:ウ
計算した合計値 total を呼び出し元に返す必要があるため return total。
「出力する」と「return する」は別物です。出力は画面に表示するだけで、呼び出し元に値は渡りません。