昨天开始看《数据结构与算法分析-java语言描述》这本书,在第二章举例了一个算法问题“最大子序列和问题”,在第三种递归方法,由于开始并没有很好理解,递归调用在算法中有很重要,用了最简单一个例子来加深理解!(当然这种方法在这四种算法中不是最优的)。
先给出源代码:
package secondCHA;
public class maxSUM3 {
static int MaxSubSum( int A[], int Left, int Right) //问题?初始left和right是先给定的吗?值是多少
{
int MaxLeftSum,MaxRightSum;
int MaxLeftBorderSum,MaxRightBorderSum;
int LeftBorderSum,RightBorderSum;
int Center,i;
//递归终点,left>right的情况是不可能出现的,除非N是负数。
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);
// 计算left达到中间分界处的两个最大和的和数
MaxLeftBorderSum = 0;
LeftBorderSum = 0;
for(i = Center;i >= Left;i--)
{
LeftBorderSum += A[i];
if(LeftBorderSum > MaxLeftBorderSum)
MaxLeftBorderSum = LeftBorderSum;
}
// 计算right达到中间分界处的两个最大和的和数
MaxRightBorderSum = 0;
RightBorderSum = 0;
for(i = Center+1;i <= Right;i++)
{
RightBorderSum += A[i];
if(RightBorderSum > MaxRightBorderSum)
MaxRightBorderSum = RightBorderSum;
}
return Max(MaxLeftSum,MaxRightSum,MaxLeftBorderSum + MaxRightBorderSum);
}
static int Max(int a, int b, int c)
{
if(a>b&&a>c)
return a;
else if(b>a&&b>c)
return b;
else
return c;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] a={4,-3,5,-2,-1,2,6,-2};
int left=0;
int right=a.length-1;
System.out.println(MaxSubSum(a,left,right));
}
}
用8个元素的数组进行分析:
A0 |
A1 |
A2 |
A3 |
A4 |
A5 |
A6 |
A7 |
4 |
-3 |
5 |
-2 |
-1 |
2 |
6 |
-2 |
第一次:MaxSubSum(A,0,7)
A0 |
A1 |
A2 |