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
ます。そのため、呼び出しごとに astack entry
が作成され、現在の呼び出しが保存され、次の呼び出しに向けて移動します。
ここで、基本条件に達すると、関数の前の状態をポップすることによって が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