3 - 再帰呼び出し

1、関数を呼び出す:あなたは機能の動作中に別の関数を呼び出すときに、呼び出される関数を実行する前に、システムは、3つのことを必要とします。

  • 呼び出された関数にすべての実際のパラメータ、戻りアドレスやその他の情報を渡します。
  • (パラメータを含む)と呼ばれる関数のローカル変数のための記憶領域を割り当て
  • 転送は、呼び出された関数のエントリに制御します
#### 自己调用自己
# include <stdio.h>

void f(int n)
{
    if (n == 1)
        printf("込込\n");
    else
        f(n-1);
}

int main(void)
{
    f(3);

    return 0;
}

2は、関数と呼ば関数呼び出しから返される前に、システムは、3つのことを達成する必要があります。

  • 呼び出された関数の戻りを保存
  • アップ無料ストレージスペースは、呼び出された関数によって占有されています
  • 呼ばれる機能に応じて呼び出し元の関数に戻りアドレス転送制御に保存されています
#### 不同函数之间的相互调用
# include <stdio.h>

void f();
void g();
void k();

void f()
{
    printf("FFFF\n");
    g();
    printf("1111\n");
}

void g()
{
    printf("GGGG\n");
    k();
    printf("2222\n");
}

void k()
{
    printf("KKKK\n");
}

int main(void)
{
    f();

    return 0;
}

関数が複数存在する場合図3は、「最初の通話に戻る」原理、情報転送及び転送制御によれば、相互に呼び出す関数が「スタック」が達成されなければならないと述べ、すなわちシステム全体のプログラムのデータ空間を実行するために必要とされる間意味スタックに配置され、関数が呼び出されるたびに、スタックの最上位に記憶領域を割り当てる機能の終了は、それがその記憶領域を解放するたびにプッシュ動作を実行する、それが現在実行中、ポップ操作でしたスタック位置で常に機能。

4、機能や関数は関数は、コンピュータ内の関数を呼び出すBを呼び出すことが、それをより多くの奇妙な思考の私たちの日常の方法と、何ら変わりはないように思われます。

2-1:再帰的な3つの条件が満たされなければなりません

、再帰的には明確な終了条件を持っている必要があります

関数デクリメントで処理されるデータのB、サイズ

C、変換が解けるでなければなりません

3-1:長所と短所と再帰ループ

再帰:
1、理解しやすいです

2、遅いです

3、大規模なストレージスペース

サイクル
を理解するのが難しい1、
2を、スピード
3、小さなメモリ空間

4-1階乗リサイクル

# include <stdio.h>

int main(void)
{
    int val;
    int i, mult=1;

    printf("请输入一个数字: ");
    printf("val = ");
    scanf("%d", &val);

    for (i=1; i<=val; ++i)
        mult = mult * i;
    
    printf("%d的阶乘是:%d\n", val, mult);


    return 0;
}

再帰的な和

# include <stdio.h>

long sum(int n)
{
    if (1 == n)
        return 1;
    else
        return n + sum(n-1);
}

int main(void)
{
    printf("%ld\n", sum(100));

    return 0;
}

ハノイの塔4-2

# include <stdio.h>

void hannuota(int n, char A, char B, char C)
{
/*
    如果是1个盘子
        直接将A柱子上的盘子从A移到C
    否则
        先将A柱子上的n-1个盘子借助C移到B
        直接将A柱子上的盘子从A移到C
        最后将B柱子上的n-1个盘子借助A移到C
*/
    if (1 == n)
    {
        printf("将编号为%d的盘子直接从%c柱子移到%c柱子\n", n, A, C);
    }
    else
    {
        hannuota(n-1, A, C, B);
        printf("将编号为%d的盘子直接从%c柱子移到%c柱子\n", n, A, C);
        hannuota(n-1, B, A, C);
    }
}

int main(void)
{
    char ch1 = 'A';
    char ch2 = 'B';
    char ch3 = 'C';
    int n;

    printf("请输入要移动盘子的个数: ");
    scanf("%d", &n);

    hannuota(n, 'A', 'B', 'C');


    return 0;
}

4-3間接的に自分自身を呼び出します

# include <stdio.h>

void f(int n)
{
    g(n);
}

void g(int m)
{
    f(m);
}

int main(void)
{

    return 0;
}

関数は、B 4-4 A例関数を呼び出します

# include <stdio.h>

int f(int n)
{
    int i, j;
    n += 2;  // n = n + 2;
    
    return n;
}

int main(void)
{
    int val;

    val = f(5);
    printf("val = %d\n", val);

    return 0;
}

関数は、B 4-4 A(実施例2)関数を呼び出します

# include <stdio.h>

int g(int);

int f(int n)
{
    if (n < 3)
        printf("込込\n");
    else
        n = f(n-1);

    return n;
}

int g(int m)
{
    m = m*2;
    return m;
}

int main(void)
{
    int val;

    val = f(5);

    return 0;
}

4-6再帰処理の大きさを減少させるの値をインクリメントします

# include <stdio.h>

int g(int);

int f(int n)
{
    if (n > 7)
        printf("込込\n");
    else
        n = f(n+1);

    return n;
}

int g(int m)
{
    m = m*2;
    return m;
}

int main(void)
{
    int val;

    val = f(5);

    return 0;
}

階乗の4-7再帰的な実装

# include <stdio.h>

//假定n的值是1或大于1的值
long f(long n)
{
    if (1 == n)
        return 1;
    else
        return f(n-1) * n;

}

int main(void)
{
    printf("%ld\n", f(100));

    return 0;
}

おすすめ

転載: www.cnblogs.com/Guard9/p/11144974.html