我已沒法用語言來描述遞歸有多牛逼。ios
#include<iostream> #include<vector> #include<algorithm> using namespace std; int max_sub_array(vector<int>& data, int left, int right); int max_crossing_sub_array(vector<int>& data, int left, int mid, int right); int main() { vector<int> data = { 3,0,5,2,7,8,9,6,1 }; //獲取序列元素個數 int length = 9; int left = 0; int right = 8; int sum = 0; sum = max_sub_array(data, left, right); cout << sum << " "; } int max_sub_array(vector<int> &data, int left, int right) { if (left >= right)//由於這個時候表示已經分解到只剩一個元素了,就是遞歸的終止條件,子數組的最大值就是元素自己,返回 { return data[left]; } else { //將序列一分爲二獲取中間位置 int mid = (left + right) / 2; int max_left, max_right, max_cross, Smax;//用來存儲子數組的和 //分治 max_left = max_sub_array(data, left, mid);//左邊子數組的和 max_right = max_sub_array(data, mid + 1, right);//右邊子數組的和 //合併 max_cross = max_crossing_sub_array(data, left, mid, right);//跨越中心的子數組的和 Smax = max(max(max_left, max_right), max_cross); return Smax; } } int max_crossing_sub_array(vector<int>& data, int left, int mid, int right) { int left_max = -99999;//不可能達到的一個數 int right_max = -99999; int sum = 0; /*計算以mid結尾的最大的子數組和,左邊子數組*/ for (int i = mid; i >= left; --i) { sum += data.at(i); if (sum > left_max) left_max = sum; } sum = 0; /*計算以mid+1開始的最大的子數組和,右邊子數組*/ for (int i = mid + 1; i <= right; ++i) { sum += data.at(i); if (sum > right_max) right_max = sum; } return left_max + right_max; }