Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 理解递归函数 int Max_Subarray_Sum(int arr[],int n) { 如果(n==1) { return arr[0];//右子数组将返回什么 } int m=n/2; int left_MSS=最大子阵列和(arr,m); int right_MSS=Max_Subarray_Sum(arr+m,n-m);//为什么arr+m将d0 int leftsum=int_MIN,rightsum=int_MIN,sum=0; for(int i=m;i=0;i--) { 总和+=arr[i]; leftsum=最大值(leftsum,sum); } }_C_Algorithm - Fatal编程技术网

C 理解递归函数 int Max_Subarray_Sum(int arr[],int n) { 如果(n==1) { return arr[0];//右子数组将返回什么 } int m=n/2; int left_MSS=最大子阵列和(arr,m); int right_MSS=Max_Subarray_Sum(arr+m,n-m);//为什么arr+m将d0 int leftsum=int_MIN,rightsum=int_MIN,sum=0; for(int i=m;i=0;i--) { 总和+=arr[i]; leftsum=最大值(leftsum,sum); } }

C 理解递归函数 int Max_Subarray_Sum(int arr[],int n) { 如果(n==1) { return arr[0];//右子数组将返回什么 } int m=n/2; int left_MSS=最大子阵列和(arr,m); int right_MSS=Max_Subarray_Sum(arr+m,n-m);//为什么arr+m将d0 int leftsum=int_MIN,rightsum=int_MIN,sum=0; for(int i=m;i=0;i--) { 总和+=arr[i]; leftsum=最大值(leftsum,sum); } },c,algorithm,C,Algorithm,我无法理解这段代码,arr+m将做什么。 请帮助我。提前谢谢。您可以将arr视为指向整数数组起点的指针arr+m表示数组中mth元素的地址,因此这基本上将数组分为两部分: 对数组的第一个m元素调用递归函数: int Max_Subarray_Sum(int arr[], int n) { if(n == 1) { return arr[0]; // what it will be return for right Sub array } i

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

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

对数组的第一个
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
    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);
    }
}
int left_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
    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);
    }
}
int left_MSS = Max_Subarray_Sum(arr,m);
这应该行得通。您忘了添加上一次报税表。我还删除了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;
}
说明: 比如,第一次调用:Max_子数组_Sum({4,2,5},3)


如果函数声明写为:
int Max\u Subarray\u Sum(int*arr,int n)
?它与递归函数无关,在CFor中查找指针算法,在调试器中逐行遍历代码。在C中,表达式
*(arr+m)
arr[m]
相同。这导致
arr+m
等于
&arr[m]
。如果我用java编写,应该用什么来代替
arr+m
what@user4018473java是另一种语言,操作
arr+m
被视为不安全,java不允许这样做。在java中,您必须使用复制数组的两部分,或者添加指示数组开头的额外参数,并将其引用为新的零。@user4018473在java中,您需要在参数
Max\u Subarray\u Sum(array,start\u index,end\u index)
中提供范围,并使用类似
的for(int i=0;i
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