1. 犯了一个错误,引发出对递归中变量定义的思考 P71
递归中要看变量的使用范围,以及如果作为全局,下面语句是否会修改其值
#include<iostream>
#include<climits>
using namespace std;
//find_maximum used
//int mid; 这里犯了一个错误,看下面 ,递归中用变量,要考虑其是局部全局
int mleft_sum,mleft_low,mleft_high;
int mright_sum,mright_low,mright_high;
int mcross_sum,mcross_low,mcross_high;
int result_low,result_high;
//find_max_crossmid used
int left_sum,right_sum,sum;
int A[16] = {13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7};
int find_max_crossmid(int a[],int low,int mid, int high, int& max_left, int& max_right)
{
left_sum = INT_MIN;
sum = 0;
for (int i = mid; i >= low; i--)
{
sum = sum + a[i];
if (sum > left_sum)
{
left_sum = sum;
max_left = i;
}
}
right_sum = INT_MIN;
sum = 0;
for (int j = mid + 1; j <= high; j++)
{
sum = sum + a[j];
if (sum > right_sum)
{
right_sum = sum;
max_right = j;
}
}
return (left_sum + right_sum);
}
int find_maximum(int a[],int low, int high)
{
if (low == high)
{
result_low = low;
result_high = high;
return a[low];
}
else
{
int mid = (low + high)/2;
//问题在这里,mid 是全局变量结果就不一样,这是必须是局部变量,否则下面
//第一行就改变了mid的值,第二行用的mid就是下次递归的mid
//而作为局部变量,其适用范围确定,编译时会产生mid1,mid2。。。不用担心重复定义
mleft_sum = find_maximum(a,low,mid);
mright_sum = find_maximum(a,mid + 1,high);
mcross_sum = find_max_crossmid(a,low,mid,high,mcross_low,mcross_high);
if ((mleft_sum >= mright_sum) && (mleft_sum >= mcross_sum))
{
result_low = mleft_low; result_high = mleft_high;
return mleft_sum;
}
else if ((mright_sum >= mleft_sum) && (mright_sum >= mcross_sum))
{
result_low = mright_low; result_high = mright_high;
return mright_sum;
}
else{
result_low = mcross_low; result_high = mcross_high;
return mcross_sum;
}
}
}
int main()
{
cout << find_maximum(A,0,15);
return 0;
}