基本情報技術者 2009年 春期 午前(科目A) 問08
問題文
自然数に対して、次のように再帰的に定義される関数を考える。の値はどれか。
: if then return 1 else return
選択肢
ア:6
イ:9
ウ:15(正解)
エ:25
🔒 解説は解答すると表示されます
再帰による階差和【午前解説】
正解の理由
定義に従い f(n) を展開すると、f(5) は 1 から 5 までの整数の和そのものになります。閉形式で書けば
なので です。したがって正解は ウ(15)です。
解法ステップ
- 定義を確認: if then return 1, else return .
- 基底値を適用:(定義より)。
- 漸次計算:
- あるいは総和公式を使って と即座に求める。
選択肢別の誤答解説
- ア: 6 — これは の値に相当します。5 まで計算するべきところを 3 で止めてしまった誤りです。
- イ: 9 — 部分和の計算ミス(例えば 5+4=9 のような誤った途中計算)や、1 を基底として正しく加算できなかった結果です。
- ウ: 15 — 正解。1 から 5 までの和、または公式 から得られます。
- エ: 25 — を当てはめたミス。和ではなく二乗を誤って使う典型的なミスです。
よくある誤解
- 「基底が n≤1 のとき 1 を返す」を見落として f(1)=0 として計算する誤り。これで全体が1足りなくなります。
- 5 の二乗(25)や別の二項計算を誤って当てはめ、合計ではなく を答えるミス。
- 再帰展開を途中で止めてしまい、例えば f(3) までしか足さないなど範囲の勘違いをすること。
補足コラム
この問題は「三角数(triangular number)」の基礎問題です。一般に再帰 f(n)=n+f(n-1)、かつ f(1)=1 のとき となり、 と表現されます。プログラム的には再帰でも反復でも実装できますが、再帰深さやオーバーヘッドを考えると反復(ループ)で計算するほうが効率的です。
例:Python での実装
def f_recursive(n):
if n <= 1:
return 1
return n + f_recursive(n-1)
def f_iterative(n):
s = 0
for i in range(1, n+1):
s += i
return s
print(f_recursive(5)) # 15
print(f_iterative(5)) # 15
FAQ
Q1: f(0) はどうなるか?
A1: 定義では「n ≤ 1 のとき 1 を返す」とあるので、数学的に 0 を含めるなら f(0)=1 です。ただし問題は自然数 n を対象としているので通常は n≥1 を想定します。
A1: 定義では「n ≤ 1 のとき 1 を返す」とあるので、数学的に 0 を含めるなら f(0)=1 です。ただし問題は自然数 n を対象としているので通常は n≥1 を想定します。
Q2: 総和の公式はどう導けるか?
A2: ガウス和の方法などで示せます。 として前後を足すと となり、 を得ます。帰納法でも証明可能です。
A2: ガウス和の方法などで示せます。 として前後を足すと となり、 を得ます。帰納法でも証明可能です。
Q3: 再帰と反復、どちらで解くべきか?
A3: 思考での計算や試験回答ではどちらでも構いませんが、実装では反復がスタックを使わず安定して高速です。時間計算量はどちらも O(n) です。
A3: 思考での計算や試験回答ではどちらでも構いませんが、実装では反復がスタックを使わず安定して高速です。時間計算量はどちらも O(n) です。
関連キーワード: 再帰関数、等差数列、三角数、帰納法、アルゴリズム、再帰展開、総和公式

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

