pulpul 日本の試験

基本情報技術者 概念書 · アルゴリズムとプログラミング

手続と関数

要点と定義

手続は、名前を付けて切り出した処理を、呼出し元から呼び出して実行する仕組みです。関数はそのうち、処理結果を戻り値として返すものです。言語によって呼び分けや書き方は異なりますが、処理をまとめて再利用し、呼出し側から細部を隠す点は共通します。

呼出し時に渡す値や参照を引数、処理後に呼出し元へ返す値を戻り値といいます。関数の中で宣言して使う局所変数は、原則としてその関数内の処理に使います。例えば 税込額(価格, 税率) のような関数なら、価格と税率を引数に受け取り、計算結果を戻り値にできます。呼出し側は、その値を表示したり、別の計算に使ったりします。

副プログラムを呼ぶと、呼出し元の処理位置が保存され、呼出し先の処理が終わると戻ります。複数の副プログラムを使って日数を計算する例では、日付計算側がうるう年判定や割り切れるかの判定を呼び出します。戻り値やレジスタの受渡し方を仕様としてそろえることが、呼出し側と呼出し先を正しく連携させる条件です。

関数は値を返すだけでなく、引数で受け取った共有データや構造体を更新する場合もあります。信号設定の関数は区間の配列を引数として受け取り、区間内の列車の有無に応じて各区間の信号を更新します。引数と戻り値だけでなく、どのデータを変更するかも仕様に含めて読み取ります。

再帰関数は、自分自身を呼び出して問題を小さくしながら解く関数です。経路を探索する処理では、次の区間を調べるために関数を再度呼び出し、行先に到達できるかを返します。再帰には、これ以上呼び出さず結果を返す終了条件が必要です。

適用条件と例

関数を設計・読むときは、少なくとも「何を引数で受け取るか」「どんな戻り値を返すか」「どの状態を変更するか」を確認します。例えば、数値を受け取って判定結果の真偽値を返す関数と、配列を受け取って内容を書き換える手続では、呼出し側が期待する役割が異なります。戻り値を使うなら、呼出し後にそれを受け取る処理が必要です。状態を更新するなら、更新対象と更新条件が明確でなければなりません。

戻り値は計算結果だけでなく、エラーや上限超過を伝える設計にもできます。日数計算の例では、16ビットの符号なし累積値が65535を超えると論理加算のオーバーフローが起きます。結果だけを返す仕様では表せない異常を呼出し元へ知らせるため、加算直後のフラグを確認して戻る設計が問われています。これは、戻り値以外の状態を連携に使う場合は、その状態がどの処理で設定され、呼出し元まで保たれるかを追う必要がある例です。

配列から最小の終了時刻を探す処理では、走査用の添字と、現在の最小値を持つ要素の添字を別に管理します。選んだ要素の添字を窓口番号として記録し、その窓口に今回の終了時刻を格納します。こうした処理を手続としてまとめるときも、行番号と配列添字を混同しないよう、引数や更新対象の役割を明確にします。

この節の続き

ここまでが冒頭部分です。ログインすると、無料でも1日2節まで全文をお読みいただけます。

アプリでこの節を読む