3

方法は次のとおりです。

public static String CPUcolor () 
{ 
    System.out.println ("What color am I?") ; 
    String s = getIns() ; 
    System.out.println ("are you sure I'm "+s+"? (Y/N)") ; 
    String a = getIns() ; 
    while (!((a.equals ("y")) || (a.equals ("Y")) || (a.equals ("n")) || (a.equals ("N")))) 
        {
            System.out.println ("try again") ; 
            a = getIns () ; 
        } 
    if (a.equals ("n") || a.equals("N"))
        {CPUcolor() ;} 
    System.out.println ("I am "+s) ;
    return s ; 
}

このメソッドの可能な出力は次のとおりです(yとnはユーザー入力です)。

What color am I?
red
are you sure I'm red? (Y/N)
N
What color am I?
blue
are you sure I'm blue? (Y/N)
N
What color am I?
Yellow
are you sure I'm Yellow? (Y/N)
y
I am Yellow
I am blue
I am red

線の「私は青」と「私は赤」が印刷されているのはなぜですか?最初に入力され、最後に印刷された赤で逆の順序で印刷されるのはなぜですか?

4

4 に答える 4

5

ご了承ください

    if (a.equals ("n") || a.equals("N"))
        {CPUcolor() ;} 
    System.out.println ("I am "+s) ;

する必要があります:

    if (a.equals ("n") || a.equals("N"))
        {CPUcolor() ;} 
    else
        {System.out.println ("I am "+s) ;}

このように、ユーザーが実際に答えたときに単一のインスタンスでのみ色を印刷します(ユーザーが答えたときにそれらのインスタンスの色を印刷したくない、再帰をほどくときに逆の順序で再訪するインスタンス-理由他の回答が印刷された逆の順序。)YesNo

また、この特定の例では再帰は必要ない(または必要ない)ことに注意してelseください。メソッドを追加すると、末尾再帰になり、同じ効果を繰り返し達成できます。再帰を排除することで、脆弱性の問題、つまり、Noプログラムが最終的に次のようにクラッシュするStackOverflowExceptionまで、悪意のあるユーザーが無期限に侵入する可能性も排除します。

public static String CPUcolor () 
{ 
  while (true) {
    System.out.println ("What color am I?") ; 
    String s = getIns() ; 
    System.out.println ("are you sure I'm "+s+"? (Y/N)") ; 
    String a = getIns() ; 
    while (!((a.equals ("y")) || (a.equals ("Y")) || (a.equals ("n")) || (a.equals ("N")))) 
        {
            System.out.println ("try again") ; 
            a = getIns () ; 
        } 
    if (a.equals ("y") || a.equals("Y")) {
      System.out.println ("I am "+s) ;
      return s ; 
    }
  }
}
于 2010-04-09T23:28:12.137 に答える
3

これは単純な再帰です。あなたは再びCPUcolor()あなたの内に呼びかけています。CPUcolor()呼び出しが戻ると、元の各メソッドの残りのコマンドが実行されます。
これを修正するには、返品を追加する必要があります。

if (a.equals ("n") || a.equals("N"))
{
  return CPUcolor();
}
于 2010-04-09T23:28:10.200 に答える
2

何が起こっているのかを少し明確にするために、出力をインデントしました。

What color am I?
red
are you sure I'm red? (Y/N)
N
    What color am I?
    blue
    are you sure I'm blue? (Y/N)
    N
        What color am I?
        Yellow
        are you sure I'm Yellow? (Y/N)
        y
        I am Yellow
    I am blue
I am red

インデントのすべてのレベルは、呼び出し階層の1レベル深く、CPUColor()へのもう1つの呼び出しです。CPUColor()の呼び出しが戻った後も、その後の残りの部分を実行する必要があります。

私はそれをファイルディレクトリツリーのフォルダと同じように表示するのが好きです。ディレクトリの下位レベルを折りたたんで展開することを想像してみてください。

于 2010-04-09T23:29:06.757 に答える
0

これは、この結果を出力する前に新しいCPUColor()を呼び出しているためです。

于 2010-04-09T23:28:26.770 に答える