如何理解递归函数的顺序?


// Driver Code
public static void main(String[] args) {
int test = 3;
printFun(test);
}
static void printFun(int test) {         
if (test < 1)
return;
else {
System.out.printf("%d ", test);
printFun(test - 1); // statement 2
System.out.printf("%d ", test);
return;
}
}

在这段代码中,取自GeeksforGeeks。有些我无法理解,它写3 2 1 1 2 3,递归函数在堆栈中分配。所以它在第二个printf之前调用statement2,这是否意味着它首先写入递归函数并跳过第二个printf,直到满足基本情况,然后打印第二个printf。我无法完全理解顺序。

调用函数时,该函数将运行完成,然后返回。这在递归用例中也是如此,每个调用在返回之前完成。但是,当然,每次完成都意味着使用不同的堆栈调用另一个时间的相同函数。所以这就是在伪代码中发生的情况:

printFun(3)
print 3
call printfun(2)
print 2
call printfun(1)
print 1
call printfun(0)
return
print 1
return
print 2
return
print 3
return

输出是 3 2 1 1 2 3 ,3 2 1作为第一个 System.out.println() 语句的一部分打印。

1 2 3 作为第二个 System.out.println() 语句的一部分打印。

  • 当 test=3 的值时,它打印 3,并再次调用该函数 值 = 2。
  • 当 test=2 的值时,它打印 2,并调用 再次使用该函数,值 = 1。
  • 当 test 的值 = 1 时,它 打印 1,然后再次调用函数,值 = 0。
  • 当值 测试 =0,条件 if(测试 <1)为 true 并返回。
  • 但是现在它来完成递归函数调用下方的函数部分,因此 1 再次打印在这里。
  • 类似地,它来完成函数递归调用下方的函数部分,因此 2 和 3 分别打印在这里。

最新更新