0

大学のノートでCの文字列を逆にする次のコードを見つけました。私には魔法のように見えるので、この例で再帰がどのように機能するのかわかりません。具体的には、「one」という単語を入力すると、プログラムは「eno」という単語を出力します。説明によると、この関数は、ユーザーがEnter('\ n')を押すまでユーザーから文字を再帰的に読み取り、反転した単語を出力します。しかし、関数が最後に再帰的に自分自身を呼び出すのが、ユーザーがEnterキーを押したときであり、その後、プログラムがprintfを呼び出すために関数に再び入ることができない場合、どのように単語を印刷できますか?ある種のバッファを使用しますか?それはどのように機能しますか?Cのソースコードは次のとおりです。

#include <stdio.h>

void readCharsAndReverse(void);

int main (void)
{
    printf ("Give characters to reverse:");
    readCharsAndReverse();
    printf ("\n\n");
    system("PAUSE");
}

void readCharsAndReverse(void)
{
    char ch;
    scanf ("%c", &ch);
    if (ch != '\n')
       readCharsAndReverse();
    printf ("%c", ch);
 }  
4

6 に答える 6

1

そうです、これがあなたが探している答えだと思います。

プログラムには、いわゆるスタックがあります。関数を呼び出すたびに、このスタック(スタックフレーム)に関数に関する情報を保持するためのスペースが作成されます。これは通常、変更されるレジスタ(これについては気にしないでください)、リターンアドレス、またはそれを呼び出した関数、および関数によって使用される変数です。

を呼び出すたびreadCharsAndReverseに、新しいフレームがスタックに配置されます。これにはローカル変数が含まれますch。終了するreadCharsAndReverseと、現在のスタックフレームが削除(ポップ)され、コンピューターreadCharsAndReverseは呼び出された場所(この例では、通常はreadCharsAndReverse()回線上)から実行を開始します。これが発生すると、の値は、再度ch呼び出す前の値とまったく同じに維持されますreadCharsAndReverse

于 2012-10-14T12:47:09.583 に答える
1

基本的に、この関数は文字をローカル変数に読み込み、chそれ自体を呼び出して出力しchます。

それは次のような意味です。

  • 初めて呼び出されたreadCharsAndReverseは、自分自身を読み込んoch呼び出します。

  • 2回目に呼び出されたreadCharsAndReverseは、自分自身を読み込んnch呼び出します。

  • 3回目に呼び出されたreadCharsAndReverseは、自分自身を読み込んech呼び出します。

  • 4回目に呼び出されたreadCharsAndReverseが読み取り\n3回目に呼び出されたreadCharsAndReverseに戻ります。

  • 3回目に呼び出されたreadCharsAndReverseはそのchを出力し、 2回目に呼び出されたreadCharsAndReversee戻ります。

  • 2回目に呼び出されたreadCharsAndReverseはそのchを出力し、 1回目に呼び出されたreadCharsAndReversen戻ります。

  • 初めて呼び出されたreadCharsAndReverseは、そのchを出力しoます。これで完了です。

于 2012-10-14T12:47:42.880 に答える
1

たとえば、「one」を入力してEnterキーを押すと、readCharsAndReverse() 関数が最初に呼び出され、最初のch値が「o」に格納されます。'o' != \nこれによりreadCharsAndReverse()\n文字に対して、関数は次のようになります:

readCharsAndReverse(){
     ch = 'o';
       readreadCharsAndReverse(){
         ch = 'n';
             readreadCharsAndReverse(){
                 ch='e';
                  readreadCharsAndReverse(){
                      ch='\n';

'\ n'文字であるため、print関数が実行され、'e'から'o'に出力されます->結果は予約文字列です

于 2012-10-14T12:48:53.390 に答える
1

を入力するとすぐにEnter、メソッドreadCharsAndReverseが戻り始めます。つまり、最初に最後に入力された文字が出力され、スタック上の他のすべての再帰呼び出しがポップオフされ始めます。したがって、すべての文字を1つずつ逆の順序で出力します。

何かを下の棚に置いて上の棚に移動して同じことをするのと同じです。遭遇しEnterたら、壁に何でも貼り付けて、下の棚に戻って、そこに置いてあるものを貼り付けます。以前に貼り付けたコンテンツの横の壁など。

于 2012-10-14T12:58:33.750 に答える
0

readCharsAndReverseは、「\ n」が満たされるまで停止されないため、「one」の場合:「o」がスキャンされます。これは文字ではないので、次の「n」に続き、「e」の後に「\n」が表示されます。次に、次の行に移動します(ベースケースに到達したため、次の行は、スタックにあるもの( "eno"、 "e"が最初、 "n"が2番目、 "o"が最後)を出力するように指示します。

いつでもスタックを書きながら、もっとレイドし、もっと多くの例を見ることをお勧めします。

于 2012-10-14T12:46:32.410 に答える
0

通常、再帰はスタックを使用して機能します。関数が呼び出されると、その関数はスタックにプッシュされ、基本条件に達するまでこれが繰り返されます。最後に基本条件に達すると、各機能がポップアウトされます。そして、printfステートメントが実行されます。

于 2013-08-04T15:05:55.367 に答える