Java 递归在下面的代码中是如何工作的?

Java 递归在下面的代码中是如何工作的?,java,recursion,Java,Recursion,在上面的代码中,hello被打印了n次,我得到了,world被打印了n+1次,我根本没有得到。当n=0时,它不应该只打印一次吗?我的意思是它不会向调用函数返回任何内容。 谢谢。您正在递归调用一个函数,如果每次调用print时都没有提前返回或任何类型的条件,那么它将打印世界。 要明确,如果printfworld;在一个盒子里,否则它只能打印一次 void print (int n) { if (n>0) { printf("hello"); p

在上面的代码中,hello被打印了n次,我得到了,world被打印了n+1次,我根本没有得到。当n=0时,它不应该只打印一次吗?我的意思是它不会向调用函数返回任何内容。
谢谢。

您正在递归调用一个函数,如果每次调用print时都没有提前返回或任何类型的条件,那么它将打印世界。 要明确,如果printfworld;在一个盒子里,否则它只能打印一次

void print (int n)
{
    if (n>0)
    {
        printf("hello");
        print(n-1);
    }
    printf("world");
}

当函数在其自身中定义时,就会发生递归。在函数中,每次n>0时,您都将打印Fhello;然后用n-1再次调用自己。请记住,函数将一直对自身进行调用,直到n等于0。但是,在最后一种情况下,当n等于0时,if语句将失败并继续到方法中的最后一行printfhello。由于您的方法签名是无效的,这将导致方法完成,即使您没有特别声明返回语句。当方法完成时,我们递归地冒泡并完成每个方法的其余部分。在这种情况下,该方法的其余部分将是printfworld,它将比printfhello多打印一次

hello被打印了n次,我得到了,而world被打印了n+1次,我根本没有得到

这就是在您的案例中执行指令的方式。hello为[n,1]执行,world为[0,n]执行


因为world get被打印出来,即使它在递归停止时不打印hello。我建议使用调试器一步一步地检查代码的每一行,始终仔细查看堆栈。继续!递归是计算机科学中的一个非常难的话题。即使是最好的程序员也很难可视化递归函数的调用堆栈和输出。试着在纸上画出你的解决方案,展示每一次通话并打印对账单。它总是有助于引出这样一个问题:不是那么糟糕的问题是被某人否决。我们大多数人发现递归很难想象。
if (n>0)
{
  printf(“hello”);
  print(n-1);
}else{
  printf(“world”);
}
n : printf("hello");
    n-1 : printf("hello");
          n-2 : printf("hello");
                ....
                    2 : printf("hello");
                        1 : printf("hello");
                            0 : printf("world");  << Difference is here
                        1 : printf("world");
                    2 : printf("world");    
                ....                            
          n-2 : printf("world");
    n-1 : printf("world");
n : printf("world");