Kotlinの再帰関数を使った処理の基本!階乗・フィボナッチ数列もやさしく解説
生徒
「Kotlinで『再帰関数』っていう言葉を聞いたんですけど、どういう意味ですか?」
先生
「再帰関数というのは、自分自身を呼び出す関数のことです。繰り返し処理をするときに使われるんですよ。」
生徒
「えっ、自分自身を呼び出すってどういうことですか?難しそうです…」
先生
「大丈夫ですよ!まずは『再帰』の意味から、Kotlinでの書き方、そして代表的な例を使って順番に説明していきましょう。」
1. 再帰関数(さいきかんすう)とは?
再帰関数とは、自分の中で自分自身を呼び出す関数のことです。
たとえば、「1から5まで足していく」ような繰り返しの処理を、ループ(for文やwhile文)を使わずに関数だけで実現する方法です。
考え方は「処理を分けて、少しずつ解決していく」ことです。計算が終わる条件が必ず必要になります。
2. 再帰関数で「階乗(かいじょう)」を求めよう
階乗とは、1×2×3×…×n のように、1からnまでの数字をすべて掛け算することです。5の階乗は「5×4×3×2×1=120」となります。
Kotlinで階乗を再帰関数で書くとこうなります。
fun factorial(n: Int): Int {
return if (n <= 1) 1
else n * factorial(n - 1)
}
factorialという関数の中で、自分自身を呼び出しています。そして、nが1以下のときは1を返すことで、繰り返しを止めています。
3. Kotlinの再帰関数のしくみ
再帰関数は、毎回新しい関数の処理が積み重なるように呼び出されます。
最初にfactorial(5)が呼ばれると、それがfactorial(4)を呼び…と続き、最後にfactorial(1)で止まります。そこから順に結果を掛け算していきます。
こうして、関数がどんどん「呼び出されて→戻る」を繰り返して、答えが計算されるのです。
4. 実行してみよう!
試しに、main関数から呼び出して動かしてみましょう。
fun main() {
val result = factorial(5)
println("5の階乗は $result です")
}
5の階乗は 120 です
5. フィボナッチ数列を再帰関数で書く
次は「フィボナッチ数列」です。これは「1、1、2、3、5、8、13、…」と続く数列で、直前の2つの数を足した値が次になる特徴があります。
フィボナッチ数列のn番目の値を求める関数は、次のように書けます。
fun fibonacci(n: Int): Int {
return if (n <= 1) n
else fibonacci(n - 1) + fibonacci(n - 2)
}
たとえばfibonacci(6)を計算すると、「8」が返ってきます。
6. フィボナッチ数列を出力してみよう
0〜10番目のフィボナッチ数列を出力するには、以下のように書きます。
fun main() {
for (i in 0..10) {
print("${fibonacci(i)} ")
}
}
0 1 1 2 3 5 8 13 21 34 55
7. 再帰関数で気をつけるポイント
再帰関数には終わりの条件(終了条件)が必要です。これがないと、自分を何度も呼び続けてプログラムが止まらなくなります。
if (n <= 1)のような条件で必ず止めるようにしましょう。
また、再帰は便利ですが、たくさん呼び出されると動作が重くなることもあるので注意が必要です。
8. なぜループではなく再帰で書くのか?
ループ(forやwhile)でも同じような処理は書けますが、再帰の方が考え方がシンプルになる場合があります。
特に、数学的な問題や木構造のようなデータを扱う場面では、再帰が自然で読みやすいことが多いです。
Kotlinでは、関数をうまく使ってわかりやすいコードを書くことが推奨されているので、再帰もそのひとつです。
9. 再帰関数は初心者でも使える便利なテクニック
最初は「自分自身を呼び出す」という考え方が難しく感じるかもしれませんが、ルールに従えば安全に使えます。
Kotlinの再帰関数は、シンプルな記述で複雑な繰り返し処理が書けるので、初心者にもおすすめです。
まとめ
Kotlinの再帰関数は、自分自身を呼び出しながら処理を進めていくという独特のしくみを持った関数であり、繰り返し処理を丁寧に分解して考える力を養うためにもとても役立つ概念です。この記事では、階乗やフィボナッチ数列といった代表的な例を通して、再帰関数がどのように動き、どのような場面で便利になるのかを学びました。再帰の考え方は、計算を段階的に分解することでシンプルに捉えられるという特徴があり、数学的な処理やツリー構造の探索など、複雑な仕組みをわかりやすく表現できるのが大きな魅力です。また、再帰関数には必ず“終了条件”が必要であり、条件がなければ処理が延々と続いてしまう危険があるという点も重要です。終了条件によって適切なタイミングで処理を止めながら、計算結果を積み重ねていくことで最終的な答えにたどり着くという流れは、Kotlinの関数の考え方を深く理解するうえでも大きな助けとなるでしょう。 階乗の計算では「nが1以下なら1を返す」という明確な終了条件を設け、フィボナッチ数列の計算では「直前の2つの値を足す」という本質的な動きをそのまま表現できました。こうした自然な形で処理を記述できるのは、再帰関数ならではの書きやすさです。同じ処理をループで書くこともできますが、再帰で書くことで処理の意図や計算の構造が読み取りやすくなり、Kotlinらしい表現の美しさが際立ちます。再帰関数の基礎を理解しておくことは、今後のプログラミング学習において非常に大きな力となるはずです。繰り返し処理、数学的な計算、データ構造の理解など、多様な場面で応用できるため、今回学んだ内容をじっくり復習しながらコードを書く練習を重ねていくとよいでしょう。
再帰関数の理解を深めるサンプルコード
記事の内容をふまえて、階乗とフィボナッチ数列をまとめて動かしてみるサンプルコードを紹介します。再帰の基本構造を確認しながら読むと理解が深まります。
fun factorial(n: Int): Int {
return if (n <= 1) 1 else n * factorial(n - 1)
}
fun fibonacci(n: Int): Int {
return if (n <= 1) n else fibonacci(n - 1) + fibonacci(n - 2)
}
fun main() {
println("6の階乗は ${factorial(6)} です")
for (i in 0..10) {
print("${fibonacci(i)} ")
}
}
このサンプルでは、階乗とフィボナッチ数列の両方を再帰で実装し、計算の流れを自然に表現しています。特に、フィボナッチ数列は前の2つの値を足し合わせるという特徴をそのままコードにできるため、再帰の考え方に慣れるための良い練習になります。繰り返し処理をすっきりと書けることは、Kotlinでプログラムを組むうえで大きな強みとなり、実務でも役立つ場面が多くあります。再帰が難しいと感じるときは、まずは終了条件に注目し、計算をどのように分ければよいのかを紙に書きながら整理すると理解しやすくなります。
生徒
「再帰関数って、最初はとても難しく見えましたけど、階乗やフィボナッチの例で考えると少しずつ分かってきました!」
先生
「そうですね。再帰は“自分自身に少しずつ仕事を任せる”というイメージで考えると理解しやすくなりますよ。」
生徒
「終了条件がないと止まらなくなるという話も、すごく大事なんですね。フィボナッチも構造的に書けて面白かったです。」
先生
「その通りです。終了条件は再帰で最も重要なポイントのひとつですね。条件を正しく書けば、複雑な処理も綺麗に整理できます。」
生徒
「次は木構造とかも再帰で書いてみたいです!処理の流れを追う練習をもっとしてみます。」
先生
「とてもいい姿勢ですね。再帰は応用範囲が広いので、少しずつ慣れていけば確実に力になりますよ。」