func(x/2); ----------------> // Statement # 1
System.out.print(x % 2); ------> // Statement # 2
Statement # 2
如果您返回atUnreachable Block
的值,将会是func(x / 2) call
Statement # 1
Recursive function calls
存储在stack
. 因此,对于每次调用,stack entry
都会进行 a,存储当前调用,然后进行下一次调用。
现在,当您的基本条件达到时,通过弹出函数的先前状态stack
开始roll-back
,然后最终到达它开始的位置。
现在,在func
从堆栈中弹出每个调用之后,执行将function
在最后一次func()
调用完成的地方继续执行下一条语句(Statement # 2 in this case)
,完成后,该函数返回,该函数依次调用堆栈上的下一个函数。(注意: - 如果你有return func(x / 2)
代替func(x / 2)
,那么代码将不会执行下一条语句,而是立即将控制权交给堆栈中的下一个函数。因此Unreachable Code
)
因此最后声明
System.out.print(x % 2);
将被执行,当stack
完全清空时,控制权返回到
func(x / 2)
函数调用,位于堆栈的底部。
所以,你的递归是这样的: -
堆栈: -
func(x / 8) --> Base condition
func(x / 4) ^
func(x / 2) ^
func(x) --> First invocation
假设x / 8
是基本条件。因此,当func(x / 8)
完成执行时,执行的下一条语句是:-
System.out.println(x % 2)
-> 这里 x 的值为original-x / 8
然后这个函数从堆栈中弹出,并将控制权返回给堆栈中的下一个函数: - func(x / 4)
,然后执行下一条语句: -
System.out.println(x % 2)
->x
这里又是original-x / 4
等等。然后最终,System.out.println(x % 2)
被执行original-x