0

私はプログラミングに本当に慣れていません(私は電子工学と通信エンジニアです)。なぜ一方のプログラムが機能し、もう一方のプログラムが機能しないのか理解できません。

学習を進める前に、再帰関数についてよく理解しておく必要があります。これに関して何か助けていただければ幸いです。

x++と--xの違いを知っています。しかし、このプログラムのこのコンテキストでは、これらのプログラムは両方とも同じように実行する必要があると思いました。しかし、そうではありません。

void rec(int x)
{
    if(x>0)
        rec(x--);
    printf("%d",x);
}

int main()
{
    rec(4);
    _getch();

} /*This doesn't work. And shows a stackoverflow */

void rec(int x)
{
    if(x>0)
        rec(--x);
    printf("%d",x);
}

int main()
{
    rec(4);
    _getch();

} /*This gives a proper output as expected*/ 
/*The output is 00123*/

ありがとう!

PS:これが些細な質問や愚かな質問なら許してください、しかし私はこれに固執していて、これが私が助けを探すことができる最高の場所だと思いました。

4

2 に答える 2

4
void rec(int x) {
    if (x>0)
        rec(x--);
    printf("%d",x);
}

これは永久に繰り返されます(または少なくともスタックスペースを使い果たすまで)。の現在の値をx--使用してからデクリメントすることを意味しますx

つまり、パラメータ20を使用して呼び出しrecます。これはゼロより大きいためrec、現在の値20で再度呼び出し、次にデクリメントしますx(ただし、呼び出しが戻った後は効果的です。

したがって、あなたは永遠recに20の値でコールしているので、スタックを吹き飛ばしています。

に変更x--すると、関数に渡す--xにデクリメントされるため、になります。その時点で、スタックをバックアップして、これらすべての値を出力します。x 20, 19, 18, ... 1, 0

printf ("before: %d\n", x)ステートメントの前にaを付けた場合、画面にif多くの20行が出力されるのがわかります。

于 2012-10-01T05:23:25.993 に答える
1

x--古い値のx(デクリメント前)で関数を呼び出します。したがって、同じ値で自分自身を呼び出すという無限の再帰が得られます。--xは、xの新しい(デクリメントされた)値で関数を呼び出すため、最終的にx>0の条件になります。

これを調査する別の方法は、次のことを行うことです。

int a, b;
a = b = 1;

printf("--a: %d b--: %d\n", --a, b--); // Output is --a: 0 b--: 1
于 2012-10-01T05:23:28.357 に答える