再帰とは、関数が、その中で自分自身を呼び出すことです。はじめて見ると「まだ読み終えていない関数を、その中で使ってよいのか」と手が止まりますが、読み方はほかの関数の呼び出しと変わりません。階乗を返す5行の関数で確かめます。
期間限定クーポンPR|Udemy の講座科目B オリジナル模試 3回分・60問42%OFF 1,500円第2部 定番処理の型 全26回A8-1再帰とは一覧を開く
A1-1トレース表の書き方A1-2繰返しのトレースA1-3配列のトレースA2-1配列を全部見るA2-2最大・最小を見つけるA2-3探す(線形探索)A2-4入れる・消すA3-12次元配列の走査A3-22次元配列の集計A4-1文字列を1文字ずつA4-2文字列照合A5-1交換して並べるA5-2挿入ソートA6分割して並べるA7-12分探索A7-2ハッシュ表探索A8-1再帰とはA8-2再帰のトレースA9スタックとキューA10-1リストを読むA10-2リストの挿入と削除A11木構造A12木の巡回A13グラフA14AI・データを題材にしたプログラムA15コントロールブレーク処理
この回の内容を動画で見る
次のページで講義の目次と無料の講義を見られます。受講ボタンとクーポンコードもそこにあります。
この回の内容を動画で見る
解くための再現性が身につく講義29本小テスト86問模試3回分IT資格の森で見る
講義「再帰(自分を呼ぶ関数と終了条件)」(全9分22秒)は、IT資格の森(月額1,280円)の会員向けです。科目Bは、1行ずつ値を追うアニメの講義と、講義ごとの小テスト、本番と同じ形の模擬試験がそろっています。
再帰とは ── 関数が、自分自身を呼ぶ
n の階乗は、1 から n までの整数を全部掛けた数です。3 の階乗なら 3 × 2 × 1 = 6。次の関数 kaijou は、1 以上の整数 n を受け取って、その階乗を返します。
○整数型: kaijou(整数型: n)
if (n = 1)
return 1
endif
return n × kaijou(n - 1)
kaijou(3) を呼び出すと、6 が返ります。
最後の行を見てください。kaijou の中で、kaijou を呼んでいます。これが再帰です。
自分を呼ぶ式になるのには理由があります。3 の階乗 3 × 2 × 1 のうち、うしろの 2 × 1 は 2 の階乗です。つまり 3 の階乗 = 3 ×(2 の階乗)。n で書くと「n の階乗 = n ×((n - 1) の階乗)」で、最後の行 return n × kaijou(n - 1) は、これをそのまま書いたものです。
自分を呼ぶ式の読み方
ほかの関数の呼び出しと同じです。その関数を最初の行から実行し、返ってきた値を、呼び出しが書いてあった場所に入れます。
関数の呼び出しと return の読み方は G3-3 戻り値 にあります。
階乗で確かめる ── kaijou(3) が 6 を返すまで
kaijou(3) が返す値を、自分の手で出します。式の中に kaijou(2) のような kaijou の呼び出しが出てきたら、その呼び出しが return する式を、かっこに入れて同じ場所に書きます。返ってくる値がまだ分からないので、値の代わりに式のまま置いておく、ということです。これを、呼び出しが無くなるまで続けます。
kaijou(3) が返す値 ── 呼び出しを、返す式で置き換えていく
太字=その段で置き換えたところ
① kaijou(3) を呼ぶ(n は 3)
kaijou(3) = 3 × kaijou(2)
3 は 1 ではないので if の中には入らず、最後の行 return n × kaijou(n - 1) へ進みます。n に 3 を入れると 3 × kaijou(2)。kaijou(2) がいくつかは、まだ分かりません。
② kaijou(2) を置き換える(n は 2)
kaijou(3) = 3 × (2 × kaijou(1))
kaijou(2) も、関数の最初の行から実行します。2 は 1 ではないので、返すのは 2 × kaijou(1)。これをかっこに入れて、kaijou(2) があった場所に書きます。n は呼び出しごとに別で、kaijou(2) の中の n が 2 でも、kaijou(3) の n は 3 のままです。
③ kaijou(1) を置き換える(n は 1)
kaijou(3) = 3 × (2 × 1)
n が 1 なので、今度は if の中の return 1 です。自分を呼ばずに 1 を返すので、= の右側から kaijou が消えました。
④ 掛け算する
kaijou(3) = 6
かっこの中から計算します。2 × 1 = 2(これが kaijou(2) の返す値です)、3 × 2 = 6。kaijou(3) が返す値は 6 です。
= の右側に kaijou が残っているあいだは置き換える。消えたら計算する
終了条件 ── 自分を呼ばずに返す行
置き換えが終わったのは、kaijou(1) が自分を呼ばずに 1 を返したからです。自分を呼ばずに返す行へ入る条件(kaijou では n = 1)を、再帰の終了条件といいます。
再帰が終わるのは、自分を呼ばずに返す行があり、しかも、自分を呼ぶたびに引数が変わって、いつか終了条件に当てはまるときです。
どちらかが欠けるとどうなるかを、kaijou(3) で見ておきます。
どちらかが欠けると、置き換えが終わらない
どちらも kaijou(3) を呼び出したとき
自分を呼ばずに返す行が無い ── if の3行を消したとき
○整数型: kaijou(整数型: n) return n × kaijou(n - 1)
kaijou(3) = 3 × kaijou(2) = 3 × (2 × kaijou(1)) = 3 × (2 × (1 × kaijou(0))) …
kaijou(1) も自分を呼びます。引数は 1 を通り過ぎて 0、-1、-2 と小さくなり続け、何回置き換えても = の右側に kaijou が残ります。呼び出しが残っているあいだは掛け算を始められないので、返す値がいつまでも決まりません。
引数が変わらない ── n - 1 を n と書いたとき
○整数型: kaijou(整数型: n)
if (n = 1)
return 1
endif
return n × kaijou(n)
kaijou(3) = 3 × kaijou(3) = 3 × (3 × kaijou(3)) = 3 × (3 × (3 × kaijou(3))) …
自分を呼ばずに返す行はあっても、n が 3 のまま変わりません。n = 1 が成り立つときが来ないので、こちらも返す値が決まりません。
だから、再帰のプログラムを読むときは、値を追う前にこの2つを探します。先に見つけておけば、置き換えがどこで終わるかが分かったうえで始められます。
再帰を見たら、先に探す2つ
-
if (n = 1) return 1 endif自分を呼ばずに返す行。引数がいくつのときに、何を返すかを読みます。kaijouは「n が 1 のとき 1」。 -
return n × kaijou(n - 1)
自分を呼ぶ行で渡している引数。呼ぶたびにどう変わるかを読みます。kaijouは 1 ずつ減るので、1 以上の整数から始めれば必ず 1 に着きます。
(基本情報技術者試験 科目B サンプル問題 問7)
if (n = 0)
return 1
endif
階乗を返す関数 factorial の、終了条件の3行です。この出題は問題文で「非負の整数n の階乗はn が0 のときに1 になり」と決めているので、終了条件は n = 0 になっています。自分を呼ぶ行のほうが空欄で、入る式を解答群から選びます(サンプル問題 問7の解説)。
次に読む
| A8-2 | 再帰のトレース ─ 呼び出しを下へ書き、下から埋める |
| 問7 | サンプル問題 問7の解説 ─ 階乗を返す関数 factorial |
| G3-3 | 戻り値 ─ return で値が返るまで |
| 目次 | 基本情報技術者試験 科目B 攻略ガイド |
この記事で引用した資料
- 情報処理技術者試験 試験要綱 Ver5.6(2026年7月6日)
- 基本情報技術者試験 シラバス Ver9.2(2026年1月8日)
- 基本情報技術者試験 科目B サンプル問題(2022年12月26日公開)
いずれも独立行政法人情報処理推進機構(IPA)が公表したものです。IPAは公表済みの試験問題について、教育目的での使用に許諾および使用料を不要としていますが、著作権は放棄していません。本記事では、引用した箇所の文言を改変していません(省略や補いがある場合は、その場に明記しています)。
本文の例題(関数 kaijou)は当サイトのオリジナルです。


