數(shù)據(jù)結(jié)構(gòu)第二季 Day14 遞歸 、回溯

一、遞歸練習

1、上樓梯?(每次都過一下題目,感覺還是沒理解透徹)

image.png
image.png

2、漢諾塔(Hanoi)?

image.png
image.png
  • 補充一個小插曲,如何判斷遞歸基是要寫一個還是兩個?
  • 如果遞歸里面有 n-1 和 n-2,那么遞歸基就需要 if(n < 2)的情況;
  • 如果遞歸里面只有 n-1,那么遞歸基只要判斷 n==1 的情況;

3、漢諾塔的時間復雜度和空間復雜度是多少?

image.png

4、遞歸函數(shù)的調(diào)用棧情況是怎么樣的(腦海中要有個大概)?遞歸能轉(zhuǎn)換成非遞歸嗎?

image.png

5、遞歸轉(zhuǎn)非遞歸的萬能之法是什么?

  • 遞歸轉(zhuǎn)非遞歸的萬能之法
  • 自己維護一個棧,來保存參數(shù)、局部變量
  • 但是空間復雜度依然沒有得到優(yōu)化
image.png

6、從上述自定義棧幀思想,我們可以看出遞歸轉(zhuǎn)非遞歸的核心在什么(細細品味,優(yōu)化方向問題,很重要)?

  • 核心:盡量做到使用一組相同的變量來保存每個棧幀的內(nèi)容
image.png

二、尾調(diào)用

1、什么是尾調(diào)用?什么是尾遞歸?

image.png
image.png

2、對于尾調(diào)用,編譯器如果要進行優(yōu)化,需要什么技術(shù)支持?尾調(diào)用能被優(yōu)化的原因是什么?

  • 對于尾調(diào)用,編譯器如果要進行優(yōu)化,需要 能動態(tài)修改棧幀的長度
  • 尾調(diào)用能被優(yōu)化,是因為尾調(diào)用的函數(shù),不在使用當前棧幀的局部變量了,所以可以重復利用棧幀

3、為什么尾遞歸的優(yōu)化比尾調(diào)用簡單多了?要能簡述尾遞歸優(yōu)化思路?

image.png
  • 下圖是未進行尾遞歸優(yōu)化的匯編
image.png
  • 下圖進行尾調(diào)用優(yōu)化后的匯編代碼
image.png

4、使用尾遞歸的思想優(yōu)化斐波那契數(shù)列(了解即可)?

image.png

三、回溯(Back Tracking)

1、回溯(Back Tracking)的思想是什么?之前學過的什么搜索是典型的回溯應用?

image.png

2、八皇后問題描述?

image.png

3、八皇后解決思路?

image.png

4、 使用回溯法解決此問題的思路?(太神奇、太強了?。?/h4>
image.png
image.png
image.png
image.png

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容