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) ;}

这样,您在用户实际回答时Yes打印单个实例中的颜色(您不想在用户回答时打印这些实例的颜色,当您展开递归时您以相反的顺序重新访问的No实例- 原因打印其他答案的相反顺序。)

另请注意,在此特定示例中您不需要(也不想要)递归else:添加后,您的方法将变为tail-recursive ,并且您可以迭代地实现相同的效果。通过消除递归,您还消除了漏洞问题,即恶意用户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

每一级缩进在调用层次结构中更深一层:再调用一次 CPUColor()。在对 CPUColor() 的调用返回后,接下来的其余部分仍然必须完成。

我喜欢像查看文件目录树中的文件夹一样查看它:想象一下折叠和扩展较低级别的目录!

于 2010-04-09T23:29:06.757 回答
0

因为您在打印出这个结果之前调用了 new CPUColor() 。

于 2010-04-09T23:28:26.770 回答