C言語で漸化式のn番目の項を求めるプログラム
問題の概要
3つの整数 a、b、c と整数 n が与えられたとします。このとき、以下の漸化式で定義される数列 S(n) の第n項を求めます。
- S(1) = a
- S(2) = b
- S(3) = c
- n > 3 のとき、S(n) = S(n-1) + S(n-2) + S(n-3)
計算例
例として、a = 5、b = 2、c = 3、n = 6 が入力された場合を考えてみましょう。このときの出力は 28 になります。その理由は以下の通りです。
- S(4) = S(3) + S(2) + S(1) = 3 + 2 + 5 = 10
- S(5) = S(4) + S(3) + S(2) = 10 + 3 + 2 = 15
- S(6) = S(5) + S(4) + S(3) = 15 + 10 + 3 = 28
解き方(アルゴリズム)
この問題は再帰呼び出しを使うと非常にシンプルに解けます。a、b、c、n を引数にとる関数 solve() を定義し、次の手順で処理を行います。
- n が 1 の場合は a を返す
- n が 2 の場合は b を返す
- n が 3 の場合は c を返す
- それ以外の場合は solve(a, b, c, n-1) + solve(a, b, c, n-2) + solve(a, b, c, n-3) を返す
C言語での実装例
理解を深めるために、以下の実装例を見てみましょう。
#include <stdio.h>
int solve(int a, int b, int c, int n){
if(n == 1)
return a;
if(n == 2)
return b;
if(n == 3)
return c;
return solve(a, b, c, n-1) + solve(a, b, c, n-2) + solve(a, b, c, n-3);
}
int main(){
int a = 5, b = 2, c = 3, n = 6;
int res = solve(a, b, c, n);
printf("%d", res);
}
入力
5, 2, 3, 6
出力
28
補足:計算量について
上記のような素朴な再帰実装では、同じ項を何度も繰り返し計算してしまうため、時間計算量は O(3^n) 程度まで増大します。そのため n が大きくなると処理速度が急激に低下します。実際の開発では、一度計算した結果を配列などにキャッシュする「メモ化」や、for文による反復処理を組み合わせることで、計算量を O(n) まで改善するのが一般的です。
-
Pythonでn番目のフィボナッチ数を求めるプログラム【再帰関数による実装】
はじめに 数値 n が与えられたとき、再帰関数を定義して n 番目のフィボナッチ数を求めます。 例えば、入力が n = 8 の場合、出力は 13 になります。フィボナッチ数列の最初のいくつかの項は次のとおりです。 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ... 解き方のアプローチ この問題は、以下の手順で解くことができます。 solve() 関数を定義します。この関数は引数として n を受け取ります n <= 2 の場合、n - 1 を返します(1番目の項が 0、2番目の項が 1 になるようにするため) それ以外の場合は、solve(n - 1) + sol
-
Pythonで漸化式のn番目の項を求める方法:log₂(bₙ)の計算
次のような数列 bn を考えてみましょう。この数列は、b1 = 1 および bn+1/bn = 2n という漸化式で表されます。ここでの課題は、与えられた n に対して log2(bn) の値を求めることです。たとえば、入力が 6 の場合、出力は 15 になります。これは log2(bn) = (n × (n − 1)) / 2 = (6 × (6 − 1)) / 2 = 15 となるためです。数学的な導出手順この問題は、漸化式を段階的に展開することで解くことができます。bn+1/bn = 2nbn/bn−1 = 2n−1…(中略)…b2/b1 = 21上記の式をすべて掛け合わせると、左辺の分