C LANGUAGE TECHNOLOGY

【C言語】関数の再帰呼び出しで階乗,順列,組み合わせの計算

悩んでいる人

C言語で関数の再帰呼び出しを教えて!

こういった悩みにお答えします.

本記事の信頼性

  • リアルタイムシステムの研究歴12年.
  • 東大教員の時に,英語でOSの授業.
  • 2012年9月~2013年8月にアメリカのノースカロライナ大学チャペルヒル校コンピュータサイエンス学部2021年の世界大学学術ランキングで20位)で客員研究員として勤務.C言語でリアルタイムLinuxの研究開発
  • プログラミング歴15年以上,習得している言語: C/C++Solidity,Java,Python,Ruby,HTML/CSS/JS/PHP,MATLAB,Assembler (x64,ARM).
  • 東大教員の時に,C++言語で開発した「LLVMコンパイラの拡張」,C言語で開発した独自のリアルタイムOS「Mcube Kernel」GitHubにオープンソースとして公開

こういった私から学べます.

関数の再帰呼び出し

C言語では,関数の再帰呼び出しが可能です.

関数の再帰呼び出しとは,関数の中で自分自身を呼び出すことをいいます.

再帰呼び出しを利用すると,漸化式等の数列で表される式を簡単に記述できます.

関数の再帰呼び出しで階乗の計算

階乗を計算する\(a_n = n!\ (n \geq 0)\)は,以下の漸化式で表すことができます.

\begin{eqnarray*} a_n = \begin{cases} a_0 = 1 & (n = 0) \\ a_n = n * a_{n-1} & (n \geq 1) \end{cases} \end{eqnarray*}

上記の漸化式を再帰呼び出しをするfactorial関数で表したコードは以下になります.

このように,漸化式をほぼそのままコードに記述できます.

参考までにfor文で実装したfactorial_for関数もありますので,コードを比較してみて下さい.

実行結果は以下になります.

3行目の行末に5を入力したら,factorial関数とfactorial_for関数で0!から5!までの計算結果を表示します.

関数の再帰呼び出しで順列を計算

順列の計算式\({}_n \mathrm{P}_r (n \geq r)\)は以下になります.

$${}_n \mathrm{P}_r = n * (n - 1) * (n - 2) * \ldots * (n - r + 1) = \frac{n!}{(n-r)!}$$

再帰呼び出しで順列を計算するpermutation関数のコードは以下になります.

permutation関数は,再帰を利用するとスッキリ書けますね.

参考までにfactorial_for関数を利用して順列を計算するpermutation_for関数もありますので,コードを比較してみて下さい.

実行結果は以下になります.

3行目の行末に5と3を入力したら,\({}_5 \mathrm{P}_3 = 60\)と正しく計算できていることがわかります.

関数の再帰呼び出しで組み合わせを計算

組み合わせの計算式\({}_n \mathrm{C}_r (n \geq r)\)は以下になります.

$${}_n \mathrm{C}_r = {}_{n - 1} \mathrm{C}_r + {}_{n - 1} \mathrm{C}_{r - 1} = \frac{n!}{r!(n-r)!}$$

再帰呼び出しで組み合わせを計算するcombination関数のコードは以下になります.

参考までにfactorial_for関数を利用して組み合わせを計算するcombination_for関数もありますので,コードを比較してみて下さい.

実行結果は以下になります.

3行目の行末に5と3を入力したら,\({}_5 \mathrm{C}_3 = 10\)と正しく計算できていることがわかります.

まとめ

C言語の関数の再帰呼び出しで階乗,順列,組み合わせを計算しました.

また,for文で実装したコードと比較しました.

再帰呼び出しは難しいですが,使いこなすとスッキリしたコードを書けますので,是非習得しましょう!

C言語を独学で習得することは難しいです.

私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.

友だち追加

独学が難しいあなたは,C言語を学べるおすすめのオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!

-C LANGUAGE, TECHNOLOGY
-, , , , , , , ,