递归调用分析-最大自序列求和问题

本文通过分析《数据结构与算法分析-java语言描述》中最大子序列和问题的递归解法,深入理解递归调用过程。通过示例详细展示了递归计算步骤,从数组分析到递归终止条件,帮助读者掌握递归解决问题的方法。
摘要由CSDN通过智能技术生成

昨天开始看《数据结构与算法分析-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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值