はじめに
基本情報技術者試験の科目Bでは、
「この行(α)は全部で何回実行されるか?」
という問題がよく出ます。
特に、
- 関数の中で
- 別の関数を呼び出している
場合は、どこから数えればいいのか迷いやすいです。

ハク
関数の中でまた関数を呼んでると、頭がこんがらがるぅ……

レイ
大丈夫です。『どの関数が何回呼ばれるか』を順番に追えば解けます。
今回の例題
次のようなプログラムを考えます。
プログラム1:fact関数
整数型: fact(整数型: n)
整数型: i, ret
ret ← 1
for (i を 1 から n まで 1 ずつ増やす)
ret ← ret × i ← α
endfor
return ret
プログラム2:calc関数
整数型: calc(整数型: a, 整数型: b)
整数型: ret
ret ← fact(a) + fact(b)
return ret
問題
calc(4, 2) を呼び出したとき、
α の行は全部で何回実行されるでしょうか?
ステップ1:fact(n) は何回実行される?
fact(n) の中では、
for (i を 1 から n まで)
となっています。
つまり α の行は、
n 回実行される
ということです。
| 呼び出し | αの実行回数 |
|---|---|
| fact(4) | 4回 |
| fact(2) | 2回 |
ステップ2:実際に呼ばれる関数を確認
calc(4, 2) の中身は、
ret ← fact(4) + fact(2)
です。
つまり呼ばれるのは、
fact(4)fact(2)
の2つです。
ステップ3:回数を足す
fact(4)→ 4回fact(2)→ 2回
合計:
4 + 2 = 6
正解
6回
呼び出しの流れを図で見る
calc(4, 2)
├─ fact(4) → αを4回実行
└─ fact(2) → αを2回実行
解き方の3ステップ
- 対象の関数が1回呼ばれたときの実行回数を確認
- 実際に呼ばれる関数をすべて洗い出す
- 回数を全部足す

ハク
まず fact(n) は n 回って覚えればいいんだね!

レイ
はい。そして、呼ばれた fact の引数をすべて足せば答えになります。

ハク
なるほど!関数の中身より、呼び出しの流れを追うのが大事なんだ!
練習問題
calc(6, 3) を呼び出したとき、α の行は何回実行されるでしょうか?
プログラム1:fact関数
整数型: fact(整数型: n)
整数型: i, ret
ret ← 1
for (i を 1 から n まで 1 ずつ増やす)
ret ← ret × i ← α
endfor
return ret
プログラム2:calc関数
整数型: calc(整数型: a, 整数型: b)
整数型: ret
ret ← fact(a) + fact(b)
return ret
答え
fact(6)→ 6回fact(3)→ 3回
合計:
6 + 3 = 9
まとめ
fact(n)の α は n 回実行される- 呼び出される関数をすべて探す
- 実行回数を足す
この考え方が分かれば、科目Bの「実行回数を数える問題」はかなり解きやすくなります!


コメント