3

これは、学習プロセス中に書いた簡単なコードです。

void SingTheSong (int NumOfBottles)
{
    if (NumOfBottles == 0){
        printf("there are simply no more bottles of beer on the wall. \n");
    }

    else {
        printf("%d bottles of beer on the wall, %d bottles of beer.\n", NumOfBottles, NumOfBottles);
        int Bottleless = NumOfBottles - 1;
        printf("Take one down pass it around, %d bottles of beer on the wall. \n", Bottleless);

        SingTheSong(Bottleless);
        printf("Put a bottle in the recycling bin, there are now %d empty bottles in the bin.\n", NumOfBottles);
    }
}

int main(int argc, const char * argv[])
{
    SingTheSong(99);
    return 0;
}

私が理解できない唯一のことは、プログラムの実行時に SingTheSong(Botteless) 関数が 1 から開始される理由と、壁にビールのボトルが 0 本あるのに printf() ステートメントが表示される理由です。中括弧内のすべてがelseステートメントで実行されてからelseステートメントが再度実行されると思ったので、少し混乱しました。なぜこのようにしないのですか?

例: 「壁に 99 本のビール、99 本のビール。1 本を降ろして回し、壁に 98 本のビールを。1 本をリサイクル用ビンに入れると、1 本の空のビンがビンにある」 「壁に98本のビール、98本のビール。1本降ろして回し、壁に97本のビール。1本のボトルをリサイクルビンに入れると、2本の空のボトルがビンにある」

私は彼が初心者であることを知っています、私は初心者です。誰かが私にこれを説明してくれるので、サークルに入るのをやめます。ありがとう!

4

5 に答える 5

1

SingTheSongどのメソッドがに出力されるかを知っていると想像してくださいNif次に、ステートメントの2つのブランチを別々にトレードします。がゼロの場合NumOfBottles、「ボトルなし」メッセージを出力して戻ります。NumOfBottlesがゼロでない場合、次の3つのことを行います。

  • ボトルの数を印刷しますN
  • どのSingTheSongメソッドが印刷するかを印刷しますN-1
  • リサイクルメッセージを印刷するN

真ん中の行は再帰的です。次のように、同じ3行に展開できます。

  • ボトルの数を印刷しますN
  • ボトルの数を印刷しますN-1
  • どのSingTheSongメソッドが印刷するかを印刷しますN-2
  • リサイクルメッセージを印刷するN-1
  • リサイクルメッセージを印刷するN

真ん中の行が「ビール切れ」のメッセージになるまで、何度でも繰り返すことができます。

于 2012-11-05T01:29:37.933 に答える
0

これは関数の再帰です。SingTheSong(Bottleless)フォーム99から1を開始すると、Bottlelessを99,98,97として関数を呼び出します……1.SingTheSong(1)の後に、printfに進みます。

"printf("ごみ箱にボトルを入れてください。ビンに%d個の空のボトルがあります。\ n "、NumOfBottles);"

その後、SingTheSong(2)に戻り、最後にSingTheSong(99)に戻ります。

于 2012-11-05T01:49:40.920 に答える
0

ええと、私はあなたが問題に直面している場所を理解していませんが、ここに説明があります:

NumOfBottles = 99の場合:

printf("%d bottles of beer on the wall, %d bottles of beer.\n", NumOfBottles, NumOfBottles); // = 99 bottles of beer on the wall, 99 bottles of beer.
int Bottleless = NumOfBottles - 1; // 98
printf("Take one down pass it around, %d bottles of beer on the wall. \n", Bottleless); //98 bottles of beer on the wall. 
SingTheSong(98)

NumOfBottles = 98の場合:

printf("%d bottles of beer on the wall, %d bottles of beer.\n", NumOfBottles, NumOfBottles); //= 98 bottles of beer on the wall, 98 bottles of beer
int Bottleless = NumOfBottles - 1; // 97
printf("Take one down pass it around, %d bottles of beer on the wall. \n", Bottleless); //97 bottles of beer on the wall
SingTheSong(97);

..。

最後に、NumOfBottles = 0の場合:printf("壁にビールのボトルはもうありません。\n"); //壁にビールのボトルはもうありません。//ここに戻ります!

これで、99回印刷されます。

printf("Put a bottle in the recycling bin, there are now %d empty bottles in the bin.\n", NumOfBottles);//starting from 1 upto 99. 

これが、再帰関数がその前に呼び出されたため、そのようにならない理由ですprintf("Put a bottle...")

解決:

void SingTheSong (int NumOfBottles)
{
    if (NumOfBottles == 0){
       printf("there are simply no more bottles of beer on the wall. \n");
    } 


     else {
         printf("%d bottles of beer on the wall, %d bottles of beer.\n", NumOfBottles, NumOfBottles);
         int Bottleless = NumOfBottles - 1;
         printf("Take one down pass it around, %d bottles of beer on the wall. \n", Bottleless);
         printf("Put a bottle in the recycling bin, there are now %d empty bottles in the bin.\n", 99-Bottleless);
         SingTheSong(Bottleless);
     }
}
于 2012-11-05T01:28:45.207 に答える
0

完全な答えではありません。他の答えを補完したいものを示すだけです。

void SingTheSong (int bottlesOnWall, int bottlesInBin)
{
    if (bottlesOnWall == 0){
        printf("there are simply no more bottles of beer on the wall. \n");
    }

    else {
        printf("%d bottles of beer on the wall, %d bottles of beer.\n",bottlesOnWall, bottlesOnWall);
        printf("Take one down pass it around, %d bottles of beer on the wall. \n", --bottlesOnWall);
        printf("Put a bottle in the recycling bin, there are now %d empty bottles in the bin.\n", ++bottlesInBin);

        SingTheSong(bottlesOnWall, bottlesInBin);
    }
}

最初は次のような関数を呼び出すことができます。

SingTheSong(99, 0);

また、再帰についてもっと読みたいと思うかもしれません。

于 2012-11-05T01:31:49.290 に答える
0

ごみ箱にあるボトルの数について、SingTheSong関数再帰しています。printf

ごみ箱のロジックにも欠陥があります。ごみ箱にある現在のボトル数を再帰的に関数に渡す必要があります。現在のように、上記のように行の順序を修正すると、ビンにあるとして、壁のボトルの総数よりも常に1少ないボトルを印刷します。

この種の再帰がどのように見えるべきかを示す擬似コードを次に示します。

function singTheSong(bottlesOnWall,bottlesInBin) {
    if (bottlesOnWall == 0) {
        print("There are no more bottles.\n");
    } else {
        printf("%d bottles of beer on the wall, %d bottles of beer.\n", bottlesOnWall, bottlesOnWall);
        bottlesOnWall--;
        bottlesInBin++;
        printf("Take one down pass it around, %d bottles of beer on the wall.\n", bottlesOnWall);
        printf("Put a bottle in the recycling bin, there are now %d empty bottles in the bin.\n", bottlesInBin);
        singTheSong(bottlesOnWall,bottlesInBin);
    }
}

singTheSong(99,0);
于 2012-11-05T01:26:02.230 に答える