func(x/2); ----------------> // Statement # 1
System.out.print(x % 2); ------> // Statement # 2
Statement # 2atUnreachable Blockの値を返せばよかったでしょうfunc(x / 2) callStatement # 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