func(x/2); ----------------> // Statement # 1
System.out.print(x % 2); ------> // Statement # 2
Statement # 2
本來Unreachable Block
有你Statement # 1
Recursive function calls
返回的func(x/2) call
值存儲在stack
。因此,對於每次調用,都會創建一個stack entry
,存儲當前的呼叫,並轉向下一個呼叫。
現在,當達到基本條件時,stack
開始roll-back
,通過彈出該函數的前一個狀態,然後最終到達它開始的位置。
現在每func
呼叫從棧中彈出後,將繼續執行在function
其中最後func()
調用做(Statement # 2 in this case)
下一條語句,並完成後,該函數返回輪流調用堆棧一個功能。(注: - 如果你代替func(x/2)
有return func(x/2)
,那麼代碼將不會執行下一條語句,而是立即在堆棧中的下一個函數把控制權因此Unreachable Code
)
因此,在最後的聲明
System.out.print(x % 2);
將得到執行,當stack
完全排空,控制返回到
func(x/2)
函數調用,這是一個t堆棧的底部。
所以,你的遞歸是這樣的: -
堆棧: -
func(x/8) --> Base condition
func(x/4)^
func(x/2)^
func(x) --> First invocation
假設x/8
是基本條件。所以,當func(x/8)
完成執行,下一條語句OT執行的是: -
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
@Abraham。我希望這種解釋能讓你理解幕後發生的事情。 –
是的。非常感謝你們所有人的詳細解釋。 – Abraham