最大子序列 分治法
阿新 • • 發佈:2019-01-25
理解遞迴,不應該將函式一層一層展開,即針對程式碼中的"第一句",沒必要看成"不停呼叫函式MaxSubSum()直至Left==Right 遞迴結束"static int MaxSubSum(const int a[],int Left,int Right) { int MaxLeftSum,MaxRightSum; int MaxLeftBorderSum,MaxRightBorderSum; int Center; if(Left==Right) if(a[Left]>0) return a[Left]; else return 0; Center=(Left+Right)/2; MaxLeftSum =MaxSubSum(a,Left,Center); //第一句 MaxRightSum=MaxSubSum(a,Center+1,Right);//第二句 MaxLeftBorderSum=0;LeftBorderSum=0; for(i=Center;i>=Left;i--) { LeftBorderSum+=a[i]; if(LeftBorderSum>MaxLeftBorderSum) MaxLeftBorderSum=LeftBorderSum; } MaxRightBorderSum=0;RightBorderSum=0; for(i=Center+1;i<=Right;i++) { RightBorderSum+=a[i]; if(RightBorderSum>MaxRightBorderSum) MaxRightBorderSum=RightBorderSum; } return Max3(MaxLeftSum,MaxRightSum,MaxLeftBorderSum+MaxRightBorderSum); } int MaxSubsequenceSum(const int a[], int n) { return MaxSubSum(a,o,n-1); }
而是直接假設MaxSubSum是正確的,它求得了序列前半部分最大子序列和~
當然,需要遞迴終止條件,就是隻有一個數時,Left=Right,得到長度為1或0的子序列~~
就像數學歸納法,先證明命題f(n)對於初始條件如n=1成立,然後假設命題f(n)對於n=2,3,...,k成立,只要求證f(n)對k+1也成立一樣
這裡的初始條件就是隻有1個數,Left=Right~