算法导论第五章实例伪码转C++_最大子数组

来源:互联网 发布:设计logo用什么软件 编辑:程序博客网 时间:2024/06/05 18:55
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;
}

0 0
原创粉丝点击