******** fig2.7 ********** int max_sub_sequence_sum( int a[], unsigned int n ) { return max_sub_sum( a, 0, n-1 ); } int max_sub_sum( int a[], int left, int right ) { int max_left_sum, max_right_sum; int max_left_border_sum, max_right_border_sum; int left_border_sum, right_border_sum; int center, i; /*1*/ if( left == right ) /* Base Case */ /*2*/ if( a[left] > 0 ) /*3*/ return a[left]; else /*4*/ return 0; /*5*/ center = (left + right)/2; /*6*/ max_left_sum = max_sub_sum( a, left, center ); /*7*/ max_right_sum = max_sub_sum( a, center+1, right ); /*8*/ max_left_border_sum = 0; left_border_sum = 0; /*9*/ for(i=center; i>=left; i-- ) { /*10*/ left_border_sum += a[i]; /*11*/ if( left_border_sum > max_left_border_sum ) /*12*/ max_left_border_sum = left_border_sum; } /*13*/ max_right_border_sum = 0; right_border_sum = 0; /*14*/ for(i=center+1; i<=right; i++ ) { /*15*/ right_border_sum += a[i]; /*16*/ if( right_border_sum > max_right_border_sum ) /*17*/ max_right_border_sum = right_border_sum; } /*18*/ return max3( max_left_sum, max_right_sum, max_left_border_sum + max_right_border_sum ); }