【问题标题】:Recursive function to get the minimum maximum and sum of an array of integers获取整数数组的最小最大值和总和的递归函数
【发布时间】:2021-11-27 19:08:57
【问题描述】:

你好我有点挣扎,我真的不知道如何初始化我的 *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 不会有相同的值,所以我们之前所做的一切都没有意义吗?

【问题讨论】:

  • 也许你的老师希望函数(最初)用min_max_sum_rec(array, length, INT_MAX, INT_MIN, 0);调用
  • "作为参考,我的教授做了这个:"做了什么?最后一段代码?请编辑您的问题
  • @pmg 不...函数需要一个指针所以你不能传递 INT_MAX!顺便说一句...指向未初始化值的指针很好(在最后一个代码示例中)

标签: arrays c recursion function-definition


【解决方案1】:

函数可以如下所示

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 并返回给调用者。

至于你的函数实现,那么至少这个 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 有一个错字。

【讨论】:

  • 非常感谢您的帮助
  • @FangYuan 没有。不客气。:) 如果您满意,您可以选择最佳答案。有人投了反对票,但没有错。
  • @EricPostpischil 你是对的。我在最后一刻看到了这一点。功能已更新。
  • 一般来说,归约操作可以用它的标识元素来初始化。另外,那是零。对于乘法,它是一。对于int 的最小值,它是INT_MAX。 (实数的最小值为∞。)int 的最大值为INT_MIN。 (对于实数,-∞。)一般来说,一个空集的归约应该被认为是单位元素,所以零情况应该将*min 设置为INT_MAX*max 设置为INT_MIN,和@987654334 @ 归零。然后这也作为基本情况,消除了单独处理长度 1 的需要。
  • 为什么要递归到n == 0 ?在 1 处停止。请参阅问题中的示例。更容易
【解决方案2】:

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

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 的值大于零的情况下调用。

你问:

当我们只有一个整数的数组时,*max *min 和 *sum 是否会具有相同的值所以我们之前所做的一切都将毫无意义? p>

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

请注意,最大值/最小值和总和计算的所有比较递归结束之后。

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

这是一个不错且简单的实现但是....

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

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

【讨论】:

  • 谢谢你,你真的帮助我了解他在那里做了什么
  • @Bob__ 好吧,添加一个断言会很好,但它并不能真正解决任何问题......它只会让程序崩溃。所以这是一个文档的事情......文档需要说明:“调用此函数时 n 必须大于零;否则行为未定义”(或类似)
猜你喜欢
  • 2016-06-10
  • 2018-10-30
  • 2021-07-20
  • 1970-01-01
  • 2016-05-07
  • 1970-01-01
  • 2023-03-18
  • 2010-11-23
  • 2011-08-16
相关资源
最近更新 更多