递归函数获取整数数组的最小最大值和总和

Recursive function to get the minimum maximum and sum of an array of integers

你好,我有点挣扎,我真的不知道如何初始化我的 *min *max 和 *sum 变量,这样它就不会在循环中不断重新初始化

我这样做了,我想获得关于我应该做出哪些改变的帮助

void min_max_sum_rec(int arr[],int length,int *min,int *max,int *sum){

    if(length==1){
        return;
    }
    else{
        if(arr[0]<*min){
            *min = arr[0];
        }
        if(arr[0]>*max){
            *max = arr[0];
        }
        sum+=arr[0];
    }
    min_max_sum_rec(arr+1,length-1,min,max,sum);
}

作为参考,我的教授这样做了:

void min_max_sum(int arr[],int length,int *min,int *max,int *sum){

    if(length== 1){
        *min=*max=*sum=*arr;
         return;
    }
    min_max_sum(arr+1,length-1,min,max,sum);

    *sum+=arr[0];
    *min = (*min<arr[0]?*min:arr[0]);
    *max = (*max>arr[0]?*max:arr[0]);
}

但我不太明白,因为*min *sum 和*max 没有初始化,也不能理解if 语句。

当我们只有一个整数 *max *min 和 *sum 的数组时,它会不会有相同的值,所以我们之前所做的一切都没有意义吗?

函数可以如下所示

void min_max_sum_rec( const int a[], size_t n ,int *min, int *max, int *sum )
{
    if ( n )
    {
        min_max_sum_rec( a + 1, n - 1, min, max, sum );

        if ( n == 1 ) 
        {
            *min = a[0];
            *max = a[0];
        }
        else
        {       
            if ( a[0] < *min ) *min = a[0];   
            if ( *max < a[0] ) *max = a[0];
        }
        *sum +=  a[0];
    }
    else
    {
        *min = *max = *sum = 0;
    }
}

也就是函数一开始会调用自己,直到得到一个空的子数组。在这种情况下,它将对象 *min、*max 和 sum 以及 returns 初始化给调用者。

至于你的函数实现,那么至少这个 if 语句

if(length==1){
    return;
}

没有意义。

同样修改if语句

if(length== 1){
    *min=*max=*sum=*arr;
     return;
}

一般不正确,因为使用可以将参数 length 等于 0 的参数传递给函数。

还有这个电话

min_max_sum_rec(arr+1,length-1,min,max,sum);

应在 else 语句中。

注意:在初始代码中,我使用 sum 而不是 *sum 时出现错字。

我假设这是你的教授代码:

void min_max_sum(int arr[],int length,int *min,int *max,int *sum){

    if(length== 1){
        *min=*max=*sum=*arr;
         return;
    }
    min_max_sum(arr+1,length-1,min,max,sum);

    *sum+=arr[0];
    *min = (*min<arr[0]?*min:arr[0]);
    *max = (*max>arr[0]?*max:arr[0]);
}

很好。但是文档必须明确说明该函数只允许在 n 的值大于零的情况下调用。

你问:

Wouldn't it make it so that when we only have an array with one integer *max *min and *sum would have the same value so all we did before would be meaningless ?

嗯,不...因为我们之前没有做任何事情!

注意 max/min 的所有比较和求和计算是 递归结束后。

换句话说 - 代码不断地对越来越短的数组进行递归调用,直到只有一个元素。该元素的值(即原始数组的最后一个元素)然后用于初始化 max/min/sum。当递归调用 return 时,它会检查前一个元素是否为 larger/smaller 以更新 max/min 并更新 sum.

这是一个很好且简单的实现但是...

这个任务不应该使用递归来解决

你应该向你的教授请教一个递归真正有意义的作业。