2

これが私のコードです

using System;
public class Program
{
   public static void Method(int flowerInVase)
      {
         if (flowerInVase > 0)
         {
             Method(flowerInVase - 1);
             Console.WriteLine(flowerInVase);
         }
      }

   public static void Main()
   {
      Method(3);
   }
}

Console.WriteLine(flowerInVase);メソッドが条件によって終了するまで、メソッド自体が呼び出されることに興味があります。その後、スタックがいっぱいになると、上から各メソッドがポップアップし、コンソールは最小の 1、2、3 から始まる番号を書き込みます。

console.writelineスタックがポップアップしたときにのみ機能するのはなぜですか、なぜメソッドが終了に行く途中に 3,2,1 のように数字を書き込んでいないのですか? コンパイラは、再帰の実行が完了したときにのみ writeline を使用します。

4

7 に答える 7

10

呼び出しの構造は次のようになります。おそらく、この視覚化は、数値が 3、2、1 ではなく 1、2、3 と出力される理由を理解するのに役立ちます。

Method(3);
  flowerInVase > 0 ?
  Yes - Method(2);
    flowerInVase > 0 ?
    Yes - Method(1);
      flowerInVase > 0 ?
      Yes - Method(0);
        flowerInVase > 0 ?
        No
      WriteLine(1);
    WriteLine(2);
  WriteLine(3);

その理由は、 への呼び出しが への呼び出しのMethod(flowerInVase - 1)に来るためです。実行は、メソッドの番号を出力する機会を得る前に、メソッドの別のコピーにジャンプします。WriteLine(flowerInVase)

于 2013-01-30T20:45:15.260 に答える
3

ifステートメントの行が順序付けられているため、1、2、3 を取得しています。

Main()を呼び出しますMethod(3)。"3" を出力する前に
Method(3)呼び出します。Method(2)実行はすぐにMethod;の先頭にジャンプします。Method、 withへの最初の呼び出しはflowersinvase=3、再帰呼び出しが完了するまで完了しません。同様に、Method(2)すぐに を呼び出しMethod(1)、 をMethod(1)呼び出しますMethod(0)

Method(0)Method(1)何もせずに、中断したところに正確に戻ります。次の行はあなたの呼び出しで、「1」を出力してから戻り、中断したところからWriteLine呼び出しを開始し、「2」を出力し、「3」についても同様です。Method(2)

呼び出したメソッドが、再帰的に呼び出したメソッドにジャンプする前に完了するまで実行された場合にのみ、"3,2,1" が返されます。これは、C# の動作ではありません。メソッド呼び出しについて覚えておかなければならないことは、メソッドを呼び出すと、呼び出したメソッドの先頭にすぐに実行がジャンプするということです。メソッド呼び出しの後のコードは、メソッドが戻るまで実行されません。

于 2013-01-30T20:51:00.723 に答える
2

これを行うため:

flowerInVase = 3
call Method(3)
    call Method(2)
        call Method(1)
        WriteLine(1)
    WriteLine(2)
WriteLine(3)

出力は次のとおりです。

1
2
3

行を逆にする場合:

    Console.WriteLine(flowerInVase);
    Method(flowerInVase - 1);

最初に出力してから再帰するため、代わりに 3, 2, 1 が出力されます。

于 2013-01-30T20:45:40.230 に答える
1

コンパイラは、再帰の実行が完了したときにのみ writeline を使用します。

あなたがそうするように言ったので、それはそうします。コードでは、最初に再帰 (call Method()) を実行し、それが終了したときにのみ番号を書き込みます。

再帰を実行する前に最初に数値を書きたい場合は、コード内のステートメントを切り替える必要があります。

public static void Method(int flowerInVase)
{
   if (flowerInVase > 0)
   {
       Console.WriteLine(flowerInVase);
       Method(flowerInVase - 1);
   }
}
于 2013-01-30T20:45:07.907 に答える
1

なぜ console.writeline は、スタックしたポップアップが表示されたときにのみ機能するのですか? メソッドが終了に向かう途中で 3,2,1 などの数字を書き込まないのはなぜですか?

あなたの前にMethod(flowerInVase - 1);呼び出されるためです。 Console.WriteLine(flowerInVase);

于 2013-01-30T20:45:55.263 に答える
0

コードの実行を 1 行ずつ追うと、これは理にかなっています。分解すると、コンソールに何かを書き込む機会が得られる前に、常に再帰呼び出しの新しいインスタンスを作成するということです。許可されているすべての呼び出しを作成した場合 (if ステートメントが失敗した場合) にのみ、スレッドの制御が既存のメソッドに返されます。

Create method -> check parameter 
  -> create method - > check parameter
    -> create method -> check parameter
      etc. etc.
    -> print value
  -> print value
-> print value

これで、呼び出された方法で制御が戻っていることがわかります。最後に呼び出された関数は、それを呼び出した関数が完了する前に操作を完了する必要があります。

于 2013-01-30T20:45:36.463 に答える
0

おそらく、再帰的であることの意味を調査する必要があります。これは、再帰メソッドの非常に単純な例です。つまり、自分自身を呼び出すメソッドです。再帰は多くの分野、特にプログラミングで多くの用途がありますが、それはあなたが尋ねたものではなく、私が答えるものでもありません。

コードを 1 行ずつ読むMethod(3)と、 が呼び出され、次に が呼び出されることがわかりますMethod(2)。最も重要なことは、値 3 を出力する前にこの呼び出しを行うことMethod(2)ですMethod(3)。出力。繰り返しMethod(2)ますが、2 を出力する前に自分自身を呼び出すため、 の全体がMethod(1)この前に実行されます。

簡単なフローチャート:

Main() -> Method(3)               
              --->calls Method(2)
                            --->calls Method(1)
                                          -Method(0) not viable
                                          -if statement failed
                                          -Outputs '1'
                            -Outputs '2'
              -Outputs '3'
End of Main()
于 2013-01-30T20:50:25.447 に答える