递归调用后的代码

时间:2013-05-31 08:31:12

标签: java recursion logic

为什么递归后调用System.out.println(res)仍然运行?我以为它永远不会到达System.out.println(res);

public class recursion
{
    public static void main(String[] args)
    {
        recursion p = new recursion();
        p.perms(4, "");
    }

    public void perms(int remaining, String res)
    {
        if (remaining > 0) {
           perms(remaining - 1, res + "1");
            System.out.println(res);
        }
    }
}

5 个答案:

答案 0 :(得分:7)

考虑步骤

call perms(4,"");                   //1 st rec
        perms(3,"1");               //2 nd rec
           perms(2,"11");           //3 rd rec
              perms(1,"111');       //4 th rec

然后对于remaining = 0它不会去,如果是这样现在考虑相反的顺序

           go back to 4th rec and print 111
        go back to 3rd rec and print 11
      go back to 2nd rec and pring 1
    go back to 1st rec and print (blank space)

答案 1 :(得分:3)

当然会。

详细考虑案例p.perms(1, "");

会发生什么

if (1 > 0) { // this is true
    perms(0, res + "1");
    System.out.println(res);
}

perms(0, res + "1");是无操作,因为它没有传递if语句。这是你的递归块,你已经明智地编码了它。然后println执行,因为它是下一个语句。递归函数和非递归函数之间没有任何根本的区别,尽管使用递归函数,如果重复调用它,则可能会耗尽堆栈空间。

对于较大的remaining值,您可以以类似的方式取消递归。

答案 2 :(得分:2)

因为在最后一次递归结束时,当它没有运行时,所有先前的递归将执行该行。递归与任何其他方法调用没有什么不同,即关闭并执行其他操作,但是当您完成时,请在此时继续此方法(以及下一行)。

答案 3 :(得分:1)

它将运行三次因为在第四次调用之后,堆栈被弹出并且它将返回调用

perms(remaining - 1, res + "1");

然后System.out.println(res)将运行

对于第一次通话,它将运行

CALLING ->  perms(4-1,""+"1") -> check if(3>0) ->perms(3-1,"1"+"1")-> check if(2>0) ->perms(2-1,"11"+"1") ->check if(1>0)->perms(1-1,"111"+"1")->check if(0>0)false              
STACK index ->     0                                      1                                   2                                     3               pop the stack

在堆叠中第一次弹出后,值返回

输出 - > perms(1 - 1, res + "11"+"1");

将执行 - > System.out.println(res);

同样发生,直到它指向0

答案 4 :(得分:0)

这样容易解释。当您执行递归调用时,该功能的状态会添加到堆栈中,并且在表示基本情况(条件)时会反转。

例如

public class Main {

  private void printFun(int test) {
    if (test < 1) // base case
        return;
    System.out.println("Top Value : " + test);
    printFun(test - 1);
    System.out.println("Bottom Value :  " + test);
  }

  public static void main(String[] args) {
    int test = 3;
    new Main().printFun(test);
  }

}

输出将为

Top Value : 3
Top Value : 2
Top Value : 1
Bottom Value :  1
Bottom Value :  2
Bottom Value :  3

请注意,由于调用该函数时测试变量的值为1,所以该下限值从1继续,然后继续执行下一个调用,同时在递归行之后将代码反向。

但是,始终尝试使递归调用该函数执行的最后一件事情。之所以称为尾部递归,是因为与非尾递归相比,编译器可以更好地对其进行优化。 请在https://www.geeksforgeeks.org/tail-recursion/

上阅读有关尾递归的更多信息