递归函数获取整数数组的最小最大值和总和
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.
这是一个很好且简单的实现但是...
这个任务不应该使用递归来解决
你应该向你的教授请教一个递归真正有意义的作业。
你好,我有点挣扎,我真的不知道如何初始化我的 *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.
这是一个很好且简单的实现但是...
这个任务不应该使用递归来解决
你应该向你的教授请教一个递归真正有意义的作业。