理解递归函数

时间:2014-09-08 08:33:12

标签: c algorithm

int Max_Subarray_Sum(int arr[], int n)  
{
    if(n == 1)
    {
        return arr[0];   // what it will be return for right Sub array
    }
    int m = n / 2;
    int left_MSS = Max_Subarray_Sum(arr, m);
    int right_MSS = Max_Subarray_Sum(arr + m, n - m);  // why arr+m will d0
    int leftsum = INT_MIN, rightsum = INT_MIN, sum = 0;
    for(int i = m; i < n; i++)
    {
        sum += arr[i];
        rightsum = max(rightsum, sum);
    }
    sum = 0;
    for(int i = (m-1); i >= 0; i--)
    {
        sum += arr[i];
        leftsum = max(leftsum,sum);
    }
}

我无法理解这段代码,arr + m会做什么。 请帮帮我。
提前谢谢。

3 个答案:

答案 0 :(得分:1)

您可以将arr视为指向整数数组起点的指针。 arr + m表示数组中m元素的地址,因此基本上将数组拆分为两部分:

在数组的第一个m元素上调用递归函数:

int left_MSS = Max_Subarray_Sum(arr,m);

在数组的最后n-m个元素上调用递归函数:

int right_MSS = Max_Subarray_Sum(arr+m,n-m);

答案 1 :(得分:0)

int Max_Subarray_Sum(int arr[],int n)
{
    if(n==1)
    {
        return arr[0];   // what it will be return for right Sub array
    }
    int m = n/2;
    int left_MSS = Max_Subarray_Sum(arr,m);
    int right_MSS = Max_Subarray_Sum(arr+m,n-m);  // why arr+m will d0
    return left_MSS + right_MSS;
}

这应该有效。你忘了添加最后一个回报。我也删除了for循环,因为它的结果将被丢弃。 此函数将数组拆分为子数组,直到它只包含1个值。

答案 2 :(得分:0)

更正功能:

int Max_Subarray_Sum(int arr[],int n)   
{
  if(n==1)
  {
    return arr[0];   // what it will be return for right Sub array
  }
  int m = n/2;
  int left_MSS = Max_Subarray_Sum(arr,m);
  int right_MSS = Max_Subarray_Sum(arr+m,n-m);  // why arr+m will d0
  return left_MSS + right_MSS;        
}

说明: 比如,第一次通话:Max_Subarray_Sum({4,2,5},3)

Max_Subarray_Sum({4, 2, 5}, 3)
= Max_Subarray_Sum({4}, 1) + Max_Subarray_Sum({2, 5}, 2)
= 4 + Max_Subarray_Sum({2}, 1) + Max_Subarray_Sum({5}, 1)
= 4 + 2 + 5
= 11
相关问题