C言語での関数再帰(下記)

関数を使用してnの階乗を達成する方法、現在、ループを使用して次のことを達成しています。

int fac1(int n)
{
    int i = 0;
    int ret = 1;
    for ( i = 1; i <= n; i++)
    {
        ret *= i;
    }
    return ret;
}
int main()
{
    //求n的阶乘
    int n = 0;
    int ret = 0;
    scanf("%d", &n);
    //ret = fac1(n);//循环的方式
    printf("%d\n", ret);
    return 0;
}

ここでは、最初にnの階乗が1 2 3 ... nであることを知る必要があるため、変数i、もちろんiを定義します。= 0なので、forループを使用して条件を満たすと、ret = re = iが出力されます。これは、ret = retiと同じです。iの階乗が見つかるようにretを出力します。
次に、再帰的な方法を使用して次のことを実現します。

int fac2(int n)
{
    if (n <= 1)
        return 1;
    else
        return n*fac2(n - 1);
}
int main()
{
    //求n的阶乘
    int n = 0;
    int ret = 0;
    scanf("%d", &n);
    ret = fac2(n);
    printf("%d\n", ret);
    return 0;
}

再帰的な方法でそれを実現する方法、ルールを見つけましょう。n(n!= 0)がいくら等しくても、最初の桁は常に1なので、if関数がn <= 1と判断すると、elseは1を出力します。 n> 1の場合、出力n (n-1)、なぜ出力n(n-1)、nの階乗は1 2 3 ...(n-1)nに等しいため、nがより大きい場合1、出力n(n-1)の場合。


関数を使用してn番目のフィボナッチ数を記述する方法:
最初に、フィボナッチ数列が何であるかを知る必要があります。11
2 3 5 8 13 21 34 55この数のセットから、フィボナッチ数列の法則を引き出すことができます。 3番目の数は、前の2つの数の合計に等しく、次のステップはそれを再帰的に実装することです。

int fib(int n)
{
    if (n <= 2)
        return 1;
    else
        return fib(n - 1) + fib(n - 2);
}
int main()
{
    int n = 0;
    int ret = 0;;
    scanf("%d", &n);
    //TDD -测试驱动开发
    ret = fib(n);
    printf("ret = %d\n", ret);
    return 0;
}

n <= 2の場合
、シーケンスの最初の2つの項目は両方とも1であるため、1が出力されます。ただし、n> 2の場合、フィボナッチ数列の法則は、3番目の数が前の2つの数値、つまり(n-1)+(n-2)がここで使用されます。つまり、n番目の数値を求めると、(n-1)+(n-2)、つまりnから導出されます。 nの最初の桁と最初の2桁、それらの合計はn番目のフィボナッチ数です。


しかし、再帰的方法はフィボナッチ数列を見つけるのに非常に非効率的であるため、ここでは循環的方法を使用してそれを見つけることができます。

int fib(int n)
{
    int a = 1;
    int b = 1;
    int c = 1;
    while (n > 2)
    {
        c = a + b;
        a = b;
        b = c;
        n--;
    }
    return c;
}
int main()
{
    int n = 0;
    int ret = 0;;
    scanf("%d", &n);
    //TDD -测试驱动开发
    ret = fib(n);
    printf("ret = %d\n", ret);
    return 0;
}

n番目の数を求めるときは、最初の2つの数の合計を使用して、3番目の数を取得する必要があるため、ここでは3つの数をa、b、cとして定義し、a + b = cと規定します。 whileループを使用する必要がありますが、ループ条件を埋める方法では、n <= 2の場合、出力値は常に1になり、2より大きい場合にのみ増加し続けることがわかっているため、ループ条件n> 2を入力し、3番目のフィボナッチ数1 + 1 = 2が見つかったとすると、4番目の数1 + 2 = 3を要求するときに使用されます。このとき、aは前の数b、bになります。は前のcになり、cはループを構成しないa + b、最後のn--に等しくなります。つまり、一度実行しないとnは-1になるため、n <= 2の場合は次のようになります。ループ出力を終了しますc。

2021.1.25
常にダムコンピュータを信じる

おすすめ

転載: blog.51cto.com/15080720/2606462
おすすめ