簡體   English   中英

了解遞歸函數

[英]Understanding a recursive function

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會做什么。 請幫我。
提前致謝。

您可以將arr視為指向整數數組起點的指針。 arr + m表示數組中第m個元素的地址,因此這基本上是將數組分為兩部分:

在數組的前m元素上調用遞歸函數:

int left_MSS = Max_Subarray_Sum(arr,m);

在數組的最后一個nm元素上調用遞歸函數:

int right_MSS = Max_Subarray_Sum(arr+m,n-m);
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個值。

更正的功能:

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;        
}

說明:說,第1次通話: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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM