求數組中的最大值
該函數的功能是 在L和R範圍上返回最大值
1、 L=R表示就一個數 最大值是它自己
2、如果不止一個數 就求中點的位置
一般的寫法是 (L R)/2
但這些寫有問題 如果數組長度很大 L R可能會溢出
溢出之後 結果可能為負值
可以寫成 L (R-L)/2
(R-L)/2 表示 L ~ R 之間距離的一半
L 加上 一半的距離 也是 L ~ R 的中點
這個結果是不溢出的 因為 L、R都不溢出,R>L,所以R-L也不溢出
更簡潔的寫法
L ((R-L)>>1) 右移一位 就等同于除2了
右移一位比除2要快
3、L ~ mid 範圍的調用遞歸求一個左側部分的最大值
4、mid 1 ~ R 範圍的調用遞歸求一個右側部分的最大值
5、全局最大值就是左側最大值和右側最大值較大的那個
舉例
p(0,5)
中點位置是5/2=2的位置
p(0,2)是0~2範圍上求個最大值
p(3,5)是3~5範圍上求個最大值
隻有都返回結果了
才知道0~5範圍上的最大值是誰
p(0,2)又分為p(0,1)和p(2,2)
p(2,2)就是它自己了 直接返回
以此類推 遞推函數的依賴圖如下
所有的子點跑完
最終彙總到p(0,5)的時候 才知道最終答案
執行p(0,5)的時候 知道要調用p(0,2)
p(0,5)的結果沒有出來,p(0,5)就進棧了
調p(0,2)的時候 知道自己要先調用p(0,1)
p(0,2)就進棧了
調用p(0,1) 知道先調用p(0,0)所以p(0,1)就進棧了
p(0,0)和p(1,1)計算完之後 p(0,1)就得到結果了
此時p(0,0)和p(1,1)就出棧了
依此類推
懸而未決的東西就會進到棧中
算完的東西就會從棧裡彈出
所以就可以認為整個遞歸過程就是一個多叉樹
利用棧玩了一個遍曆
每個節點都通過自己的子節點給自己彙總信息之後
才能夠繼續往上返回
那棧空間就是一個數的高度
隻能在一個高度上壓棧
這就是遞歸的過程
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!