[英]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.