Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C言語で漸化式のn番目の項を求めるプログラム

問題の概要

3つの整数 abc と整数 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() を定義し、次の手順で処理を行います。

  1. n が 1 の場合は a を返す
  2. n が 2 の場合は b を返す
  3. n が 3 の場合は c を返す
  4. それ以外の場合は 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) まで改善するのが一般的です。

  1. 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

  2. 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上記の式をすべて掛け合わせると、左辺の分