求數組中的最大值
該函數的功能是 在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)就出棧了
依此類推
懸而未決的東西就會進到棧中
算完的東西就會從棧裡彈出
所以就可以認為整個遞歸過程就是一個多叉樹
利用棧玩了一個遍曆
每個節點都通過自己的子節點給自己彙總信息之後
才能夠繼續往上返回
那棧空間就是一個數的高度
隻能在一個高度上壓棧
這就是遞歸的過程
,