Java递归性误解

Java递归性误解,java,Java,我不理解这段代码,为什么它会算数。如果我用递归调用更改print语句中的顺序,这对我来说是有意义的,但这就是它计数的原因。在by book中,它说“System.out.println发生在每个递归调用返回之前。因此,它是向上计数而不是向下计数。”我不理解这一点。谢谢你的帮助 public static void countdown(int n) { if (n == 0) { System.out

我不理解这段代码,为什么它会算数。如果我用递归调用更改print语句中的顺序,这对我来说是有意义的,但这就是它计数的原因。在by book中,它说“System.out.println发生在每个递归调用返回之前。因此,它是向上计数而不是向下计数。”我不理解这一点。谢谢你的帮助

    public static void countdown(int n)
    {
         if (n == 0) 
         {        
              System.out.println("Blastoff!");    
         } 
         else 
         {
               countdown(n - 1); 
               System.out.println(n);        

         } 
   }

那么,如果n!=0,您的程序在“else”块中运行代码,其中是对方法倒计时(n-1)的另一个调用。例如,如果输入n=3,只要n>0,此代码就会运行。因此,基本上运行自己运行的方法,如下所示:


倒计时(3)调用方法倒计时(2),然后倒计时(2)调用倒计时(1)。只要n大于0,就会发生这种情况。如果n==0,它将打印您的消息。

因此,如果n!=0,您的程序在“else”块中运行代码,其中是对方法倒计时(n-1)的另一个调用。例如,如果输入n=3,只要n>0,此代码就会运行。因此,基本上运行自己运行的方法,如下所示:


倒计时(3)调用方法倒计时(2),然后倒计时(2)调用倒计时(1)。只要n大于0,就会发生这种情况。如果n==0,它将打印您的消息。

您应该将条件“n==0”更改为“n”您应该将条件“n==0”更改为“n” 这的确是个数字。

让我们看看实际发生的情况:每个
倒计时
调用都会首先调用自身,甚至在将任何内容写入
System.out
之前

在下面的示例中,假设我使用
2
作为参数调用
countdown

  • 调用倒计时(2)
  • 在这个方法调用中,
    n==2
    ,因此执行
    else
  • 调用倒计时(1)
  • 在这个方法调用中,
    n==1
    ,因此执行
    else
  • 调用倒计时(0)
  • 在这个方法调用中,
    n==0
    因此if条件为true,所以打印“Blastoff!”
  • 此方法退出,返回步骤3所示的方法
  • 将打印值为1的
    n
  • 方法退出,返回到步骤1所示的方法
  • 将打印
    n
    ,其值为2
  • 方法存在
  • 请注意,每个方法调用都有自己的局部变量,如
    n
    。因此,输出为:

    起飞!
    1.
    2.
    
    正如所料。您可以看到,正如书中所说,在将某些内容打印到sysout之前,该方法会调用自身

    这的确是个数字。

    让我们看看实际发生的情况:每个
    倒计时
    调用都会首先调用自身,甚至在将任何内容写入
    System.out
    之前

    在下面的示例中,假设我使用
    2
    作为参数调用
    countdown

  • 调用倒计时(2)
  • 在这个方法调用中,
    n==2
    ,因此执行
    else
  • 调用倒计时(1)
  • 在这个方法调用中,
    n==1
    ,因此执行
    else
  • 调用倒计时(0)
  • 在这个方法调用中,
    n==0
    因此if条件为true,所以打印“Blastoff!”
  • 此方法退出,返回步骤3所示的方法
  • 将打印值为1的
    n
  • 方法退出,返回到步骤1所示的方法
  • 将打印
    n
    ,其值为2
  • 方法存在
  • 请注意,每个方法调用都有自己的局部变量,如
    n
    。因此,输出为:

    起飞!
    1.
    2.
    

    正如所料。您可以看到,正如书中所说,该方法在将某些内容打印到sysout之前会调用自身。

    我刚刚运行了这个程序,它会倒计时?正如其名称所示,您的方法应该倒计时。如果您希望它计数,那么在打印“我不明白为什么我在main中调用它时这个方法计数”之前进行递归调用。它不计数,deom:。10, 9, 8, ... 正在倒计时。请澄清你的问题。@IvoVidovic我想他的意思是他想倒数,但他正在倒数。。不知道为什么,因为它实际上是倒计时的。请在外面附加调用倒计时(n)的行。我刚刚运行了这个,它倒计时?你的方法应该是倒计时,正如其名称所示。如果您希望它计数,那么在打印“我不明白为什么我在main中调用它时这个方法计数”之前进行递归调用。它不计数,deom:。10, 9, 8, ... 正在倒计时。请澄清你的问题。@IvoVidovic我想他的意思是他想倒数,但他正在倒数。。不知道为什么,因为它实际上是倒计时。请在外面附上一行,称为倒计时(n)。这是真的,我看不出这是对OP问题的回答(可能是因为问题不清楚,但仍然…)这是真的,我看不出它是对OP问题的回答(可能是因为问题不清楚,但仍然…)我不明白的是,为什么它以占优势的方式打印数字,以及背后的逻辑。当我切换打印和递归调用顺序时,我理解其主要目的的逻辑,它将倒计时,我看到它(机制)。因为这个方法首先运行自己,只要n!=0,因此它将在n==0时结束。所以,如果你在开始时放3个,它将运行4次。上次运行时(n==0),它打印System.out.println(“Blastoff!”);。然后,方法返回到上一级,在那里它以n=1运行,并打印System.out.println(1);-为什么?因为首先所有的方法都结束了,然后程序将运行并抛出其余的代码。然后,方法返回一个lev
    countdown(n - 1);
    System.out.println(n);