为什么递归后调用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);
}
}
}
答案 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/
上阅读有关尾递归的更多信息