
武蔵野個別指導塾の特徴
共通テスト情報I 関数の呼び出し—引数と戻り値を分けて処理のつながりを読む|武蔵野個別指導塾

内側の枚数だけを変える関数と、戻った値を外側へ代入する呼び出しを比べ、引数と戻り値の行き先を区別できます。
よくあるのは、関数の中の変数と外側の同名変数を混同する場面です。処理をまとめた箱の中で値が変わったのを見て、箱の外にある同じ名前の値も変わったと考えてしまいます。呼び出し前の値、関数に渡す値、戻ってきた値の代入先を分けて書くと、どこで何が変わるかを追えます。
何を答える問題か
関数は、まとまった処理に名前を付けて呼び出す仕組みです。出題の型の1つは、引数に渡された値を関数内で計算し、戻り値を受け取った後の変数や出力を求めるものです。もう1つは、複数回の呼び出しを順に追い、前の戻り値が次の引数に使われるかを判断するものです。さらに、内側と外側に同名の変数があるとき、それぞれの値を区別する問いも考えられます。
どの型でも、関数の定義を上から読んだだけでは結果は出ません。実際に呼び出す位置へ移り、その時点の引数の値を確定してから中へ入ります。戻り値を得たら呼び出し元へ戻り、式の残りと代入を実行します。表示する処理と値を返す処理も別です。表示した値が自動的に外側の変数へ入るとは限りません。
ここで使う処理は学習用の表記です。実際の問題では、その問題で説明された記号や変数の範囲を優先してください。以下では整数を扱い、代入は右側の値を計算して左側に入れる操作です。比較の条件は文章で示し、配列、整数除算、剰余は使いません。再帰呼び出しも扱いません。
値が渡る場所を分ける
呼び出す側が渡す値を引数といい、関数の定義側で受け取る名前を仮引数といいます。例えば、外側の値が4のとき、その値を仮引数に渡せます。関数内で仮引数を更新しても、この問題の約束では外側の元の変数は変わりません。計算結果を呼び出し元へ渡すのが戻り値です。
図1のように、引数は呼び出し元から関数へ、戻り値は関数から呼び出し元へ進みます。矢印の方向を逆にせず、戻った値をどこに代入するかまで追ってください。代入先が元の変数なら、その代入によって外側の値が変わります。別の変数が代入先なら、元の変数はそのままです。

図1の中央の領域にある仮引数や、その関数内で作る変数は局所変数として扱います。ここでの約束では、局所変数はその呼び出しの中で使い、外側の同名変数とは別です。関数をもう一度呼ぶと、新しい呼び出しの仮引数にその時の値が入ります。前回の局所変数が残るものとはしません。
「返す」はそこで関数の処理を終え、指定した値を呼び出し元に渡す操作です。呼び出しが式の一部なら、その呼び出しを戻り値に置き換えて式を続けます。例えば戻り値が5で、外側でその値に2を足すなら7です。関数の中で2を足したのか、戻ってから足したのかを区別すると、途中値を確かめやすくなります。
1回の呼び出しを追う
受付に置く札の枚数を調整する自作の処理です。外側の枚数と関数内の同名の変数は別です。次の処理が終わった後の外側の枚数と結果を、それぞれ整数で答えてください。
関数 調整(枚数):
枚数 ← 枚数 + 3
枚数を返す
外側の枚数 ← 4
結果 ← 調整(外側の枚数)
ここで「+」は整数の加算です。関数内の枚数は仮引数であり、呼び出す時に渡された値を受け取ります。返した値は結果へ代入されます。外側の枚数への代入は最初の行にしかありません。
図2のように、外側の4が関数の仮引数に渡り、内側で7に変わります。返された7は結果へ入り、外側の枚数は4のままです。答えは外側の枚数が4、結果が7です。

図2の各行を処理順に言い換えると、次のようになります。まず外側の枚数に4を入れます。次に呼び出しの引数を評価して4を得て、内側の枚数に4を入れます。内側の右辺は4に3を足した7ですから、内側の枚数を7に更新します。その7を返して関数を終え、呼び出し元の結果に7を入れます。
答えを条件に戻すと、結果の7は渡した4に3を足した数です。一方、外側の枚数を7とするための外側への代入はありません。結果の代入先を見落としていないか、この2点を別々に確かめます。もし最後の行が「外側の枚数 ← 調整(外側の枚数)」であれば、返った7が外側の枚数に入るため、最終値は7です。関数の内側で直接変わったのではなく、戻った後の代入で変わります。
呼び出しを重ねたとき
展示に使うカードの枚数を2段階で調整します。関数内の数は仮引数で、外側の数とは別です。条件に合えばその場で値を返し、合わなければ次の行で返します。次の処理で、外側の数と記録の最終値を整数で答えてください。
関数 補う(数):
数が5未満なら、数 + 2 を返す
数を返す
外側の数 ← 3
記録 ← 補う(外側の数)
記録 ← 補う(記録) + 外側の数
最初の呼び出しには3が渡ります。3は5未満なので5が返り、記録は5になります。次の呼び出しには外側の数3ではなく、更新後の記録5が渡ります。5は5未満ではないため、2を足さずに5を返します。呼び出し元でその5に外側の数3を足すので、記録は8です。外側の数は3のままです。
境界を確かめるには、4と5を別に入れてみます。4なら条件に合い6を返し、5なら条件に合わず5を返します。入力が増えたのに戻り値が小さくなることも、この定義から起こります。結果の大小を直感で決めず、条件と返す行をたどる必要があります。
呼び出しごとの表にすると、1回目は「引数3、戻り値5、代入後の記録5」、2回目は「引数5、戻り値5、外側の3を加えた記録8」です。2回目の戻り値を8と書くと、外側で足す操作を関数内へ移してしまいます。最終値8を元の処理に戻し、2回目に返った5と外側の3の和になっていることを確認してください。
誤答をほどく
基本例題で「外側の枚数も7」と答える誤りを考えます。原因は、同じ名前の2つの変数を1つの箱として扱ったことです。図3のように、内側の枚数が7になった後も外側の枚数は4であり、7は結果に代入されます。

図3の誤った見方では、内側の更新が外側に直接及ぶと考えています。正しい追跡では、関数を呼び出す前に外側の欄を用意し、関数に入ったところで内側の欄を別に作ります。戻るときは内側の値そのものを外側に移すのではなく、指定された戻り値を呼び出しの位置へ渡します。最後に代入先の欄を更新すれば、外側の枚数4と結果7を区別できます。
別の誤りは、関数を呼び出した時点で結果への代入が終わったとすることです。代入の右側を評価するには、先に関数の処理を終えて戻り値を得なければなりません。途中で止まった表を見たら、呼び出し元へ戻る矢印と代入の行を補ってみてください。逆に、戻り値を受け取らずに呼び出す処理では、値が返っても外側の変数に代入したことにはなりません。
返された値の使い道を確認する
関数が値を返すことと、その値を呼び出し元が保存することは別の操作です。例えば、次の関数は受け取った整数に2を加えて返します。外側の箱に入った整数を引数にして呼び出しても、返された値を変数へ代入する行がなければ、この表記では箱の値は更新されません。関数を呼んだという事実から、外側の箱が書き換わったと推測しないことが必要です。
関数 足す(数):
数 + 2 を返す
箱 ← 1
足す(箱)
呼び出しの際、内側の数は1を受け取り、3を返します。しかし最後の行に代入先はなく、返された3は保存されません。処理後の箱は1です。これに対して最後の行が「箱 ← 足す(箱)」なら、戻り値3が箱に代入されます。最終値が異なる原因は関数内の計算ではなく、呼び出し元に戻った後の行にあります。
同じように、関数内で値を表示することと、値を返すことは区別します。表示は画面などに値を示す操作であり、返す操作が続けば呼び出し元はその戻り値を式で使えます。どちらが実行されたかは問題の定義に従って判定します。表示された数を、そのまま代入された数と取り違えないように、表示欄と変数の欄を分けるとよいでしょう。
境界と手順の確認方法
関数を含む処理を読むとき、1つの入力で答えが合っても、他の入力について同じ結果になるとは限りません。条件を含む関数では、条件に合う値と合わない値をそれぞれ試します。特に「未満」と「以上」は境界の値をどちらに含めるかが異なります。境界の直前と境界そのものを並べれば、返す行が切り替わる場所を見落としにくくなります。
また、複数回呼び出すときは、各回の表を別々に作ります。表には、呼び出し前の外側の値、渡した値、関数内の更新、返した値、呼び出し後の代入先を書きます。前回の戻り値が次の呼び出しに渡るかどうかは、次の引数に書かれた式から決まります。前回の値を無条件に使い回すわけではありません。
入力が問題の定義した範囲外の場合や、関数が途中で失敗した場合の動きは、問題文に規則がなければ決められません。処理が正常に終わって戻り値を返すことを前提にした問題では、その前提を保って追跡します。例外や時間切れについての規則が別に示された問題なら、戻り値が得られなかった時点と、その後に代入が実行されるかを、その規則に沿って確認します。
練習:呼び出し元に戻って答える
次の3問も、各呼び出しの局所変数は外側の同名変数と別で、呼び出しのたびに新しく用意されます。「返す」と関数は直ちに終わります。整数の加算を「+」、減算を「-」で表します。各問の答えは指定された変数の整数値です。
問1
関数 増やす(量):
量 ← 量 + 4
量を返す
外側の量 ← 2
控え ← 増やす(外側の量)
処理後の外側の量と控えを答えてください。
問2
関数 選ぶ(値):
値が7以上なら、値 - 3 を返す
値 + 1 を返す
結果 ← 選ぶ(6) + 選ぶ(7)
結果を答えてください。2回の呼び出しは左から順に実行します。
問3
関数 移す(数):
数 ← 数 - 1
数を返す
外側の数 ← 9
外側の数 ← 移す(外側の数)
答え ← 移す(外側の数)
処理後の外側の数と答えを求めてください。
解答と確かめ
問1は外側の量が2、控えが6です。2を渡した内側の量は2から6へ変わり、6を返します。代入先は控えなので、外側の量は2のままです。控えの6を元の条件に戻すと、渡した2に4を加えた値と一致します。内側に入る前と出た後で外側の欄を見比べると、更新の有無も確認できます。
問2は11です。最初の6は7以上ではないので7を返します。次の7は境界に等しく、7以上に当てはまるので4を返します。呼び出し元で7と4を加えて11です。それぞれの入力を条件へ戻し、6は不成立、7は成立と確認すれば、境界を取り違えた答えを防げます。
問3は外側の数が8、答えが7です。最初に9を渡し、内側で8にして返します。その8は外側の数に代入されるため、次に渡すのは9ではなく8です。2回目は7を返し、答えに入ります。返す直前の値を元の入力に照らすと、9から1を引いて8、8から1を引いて7です。2回目の戻り値を外側の数に代入する行はありません。
手元に残す要点
- 呼び出しの時点で引数の値を決め、仮引数に渡します。
- 局所変数と外側の同名変数を別の欄で追います。
- 戻り値を呼び出しの位置へ戻してから、式や代入を続けます。
- 複数回の呼び出しでは、毎回の引数と戻り値を記録します。
- 境界条件と代入先を元の処理に戻して確かめます。
どこまで戻ればよいか
答えが合わないときは、まず呼び出し直前の外側の表を見ます。引数が違えば、その前の代入まで戻ります。引数が合っていて戻り値が違えば、関数内の条件と更新を行ごとに確かめます。戻り値が合っていて最終値が違えば、呼び出し元の式と代入先を追います。
個別指導で確かめる際も、最終結果だけを聞くのではなく、呼び出しごとの内側と外側の欄を書いてもらうと、混同した場所を特定できます。同じ名前でも、値が変わる場所は処理と代入先によって決まります。
もう「日東駒専」を目標にしないでください。
武蔵境駅徒歩30秒、講師1人に生徒1人の完全1対1。授業のあいだ、先生は隣を離れません。いまの詰まりを、無料相談でそのまま話してください。
まず15分だけ電話で話したい方は、無料電話相談(15分)から。塾からお電話を差し上げます。
本気になった日が、入塾の日。
お子様の教育、迷ったら「丸投げ」してください。必ず、期待以上の結果で返します。武蔵野で育む、武蔵境で学ぶ。
電話は年中無休。365日、24時間、お電話可能。




