經常會聽到遞歸二字,卻一直不得其法,今天來徹底搞懂它
遞歸就是方法自己調用自己,每次調用傳入不同的變量,遞歸可以讓代碼簡潔
舉例分析 |
1.打印問題
寫一個打印的方法,不停的調用自己
執行結果如下
圖解分析
如下圖,
- 執行main方法,添加第一個棧幀
- 第一次調用print:傳入參數4,棧中添加第二個棧幀,n=4執行到第7行的時候,if條件成立。那麼,調用print(4-1),此時已經開始遞歸(我理解的此時遞歸處於遞的階段,等到print調用結束,開始返回的時候就是遞歸的歸的過程)
- 第二次調用print:傳入參數3,棧中添加第三個棧幀,同理if條件成立
- 第三次調用print:傳入參數2,棧中添加第四個棧幀,if條件n>2,不成立,開始執行第10行代碼,打印
- 打印完n=2,頂層棧幀退出,繼續執行第二層,此時n=3,(if中調用print方法令n=2,但是因爲n是局部變量,並不會影響第二層棧幀中n的值),所以打印出
- 同理第三層打印出n=4,然後main方法執行完畢,退出最後一層棧幀
小結
上面的遞歸過程中,只有頂層的棧不滿足if條件,執行了第10行的打印方法,然後退出,在頂層的棧的方法執行完畢之前,第二層和第三層的棧此時都才執行到if語句中,並未執行完畢,所以當頂層棧執行完畢之後,就會依次迴歸
2.階乘問題
代碼如下
main函數
階乘方法
執行結果