带指针的C-递归
我正在尝试编写一个递归函数,该函数将数组作为参数,并返回最小值和最大值。到目前为止,我只能得到最大值。我试图添加一个指针以返回最小值,但由于某些原因,它总是崩溃并显示大量警告 请帮我找出代码中的错误带指针的C-递归,c,pointers,recursion,C,Pointers,Recursion,我正在尝试编写一个递归函数,该函数将数组作为参数,并返回最小值和最大值。到目前为止,我只能得到最大值。我试图添加一个指针以返回最小值,但由于某些原因,它总是崩溃并显示大量警告 请帮我找出代码中的错误 int MinMaxArray(int arr[], int size, int* min) { if (size == 1) return arr[0]; if (arr[size - 1] > MinMaxArray(arr, (size - 1), &a
int MinMaxArray(int arr[], int size, int* min)
{
if (size == 1)
return arr[0];
if (arr[size - 1] > MinMaxArray(arr, (size - 1), &min))
return arr[size - 1];
else
return MinMaxArray(arr, (size - 1), &min);
}
所以我尝试了这个,但是返回的最小值始终是索引0中的最小值
如何让它工作
int MinMaxArray(int arr[], int size, int* min)
{
if (size == 1)
{
*min = arr[0];
return arr[0];
}
if (arr[size - 1] < MinMaxArray(arr, (size - 1), min))
*min = arr[size - 1];
else
*min = MinMaxArray(arr, (size - 1), min);
if (arr[size - 1] > MinMaxArray(arr, (size - 1), min))
return arr[size - 1];
else
return MinMaxArray(arr, (size - 1), min);
}
为调用指定的第三个参数
MinMaxArray(arr, (size - 1), &min)
具有与参数声明相关的错误类型
参数的类型为int**而参数的类型为int*
此外,未计算最小元素
<>在C++中有一个标准的算法名为Mimax元素,它返回一个指向最大数组最小元素的指针。
您可以使用用C编写的类似函数声明
另一种方法是返回一对最小和最大元素的索引
为此,您需要声明两个数据成员的结构
下面展示了如何在C中实现返回一对索引的函数
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
struct MinMax
{
size_t min;
size_t max;
};
struct MinMax minmax_element( const int a[], size_t n )
{
struct MinMax minmax = { 0, 0 };
if ( n > 1 )
{
struct MinMax current = minmax_element( a + 1, n - 1 );
++current.min; ++current.max;
if ( a[current.min] < a[minmax.min] ) minmax.min = current.min;
if ( a[minmax.max] < a[current.max] ) minmax.max = current.max;
}
return minmax;
}
#define N 10
int main(void)
{
int a[N];
srand( ( unsigned int )time(NULL ) );
for ( size_t i = 0; i < N; i++ ) a[i]= rand() % ( 2 * N );
for ( size_t i = 0; i < N; i++ ) printf( "%d ", a[i] );
putchar( '\n' );
struct MinMax minmax = minmax_element( a, N );
printf( "The minimum is %d\n", a[minmax.min] );
printf( "The maximum is %d\n", a[minmax.max] );
return 0;
}
考虑到当对应于数组大小的参数等于0时,用户可以向函数传递一个空数组。在这种情况下,您自己的函数实现具有未定义的行为
如果您可能不使用结构,那么函数可以声明为
void minmax_element( const int a[], size_t n, size_t *min, size_t *max );
或
根据这些声明更改上面显示的递归函数并不困难
比如说
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void minmax_element( const int a[], size_t n, size_t *min, size_t *max )
{
*min = 0;
*max = 0;
if ( n > 1 )
{
size_t cur_min, cur_max;
minmax_element( a + 1, n - 1, &cur_min, &cur_max );
++cur_min; ++cur_max;
if ( a[cur_min] < a[*min] ) *min = cur_min;
if ( a[*max] < a[cur_max] ) *max = cur_max;
}
}
#define N 10
int main(void)
{
int a[N];
srand( ( unsigned int )time(NULL ) );
for ( size_t i = 0; i < N; i++ ) a[i]= rand() % ( 2 * N );
for ( size_t i = 0; i < N; i++ ) printf( "%d ", a[i] );
putchar( '\n' );
size_t min;
size_t max;
minmax_element( a, N, &min, &max );
printf( "The minimum is %d\n", a[min] );
printf( "The maximum is %d\n", a[max] );
return 0;
}
像这样
#include <stdio.h>
#include <assert.h>
int MinMaxArray(int arr[], int size, int *min){
assert(arr != NULL && size > 0);
if (size == 1){
*min = arr[0];
return arr[0];
}
int max = MinMaxArray(arr, size - 1, min);
if (arr[size - 1] < *min)
*min = arr[size - 1];
return (arr[size - 1] > max) ? arr[size - 1] : max;
}
int main(void) {
int arr[] = { 1,5,9,2,6,-4,8,3,7 };
int min, max = MinMaxArray(arr, sizeof(arr)/sizeof(*arr), &min);
printf("max:%d, min:%d\n", max, min);
return 0;
}
&min->min.你为什么有第三个论点?你从来没有使用过它…哦,如果这是你试图掌握递归的话,那么把>改成。。。好吧,你就快到了。但如果这是为了一些真正的问题,那么就永远消除递归。请不要破坏你的帖子。发布问题后,它将属于CC BY-SA许可下的堆栈溢出社区。如果您想解除此帖子与您帐户的关联,请参阅wtf?我不喜欢C++,我在C…C编程!!!!!!!!!!@!monkey.D.Ganga我向你展示了一个用C语言实现的函数。再看一篇我的文章。这太复杂了,我很感激你的工作。但这不是我要问的,当然有很多方法可以实现这个MIN&MAX函数,但我只能使用递归,并且必须尽可能简单。whats size\u t?@monkey.D.Ganga它是一个整数类型,用于数组长度。assert是什么?没有它我能做什么?@monkey.D.Ganga没有它我能做吗?是删除此项或发表评论//assertar!=NULL&&size>0;assert是一个断言,表示此函数满足条件。如果不满足条件,将显示一条错误消息并中止。另一个问题是,如果函数中没有静态veriables,有什么方法可以进行此操作?@monkey.D.Ganga max可以替换为函数调用。但是,它将多次浪费地执行该函数。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void minmax_element( const int a[], size_t n, size_t *min, size_t *max )
{
*min = 0;
*max = 0;
if ( n > 1 )
{
size_t cur_min, cur_max;
minmax_element( a + 1, n - 1, &cur_min, &cur_max );
++cur_min; ++cur_max;
if ( a[cur_min] < a[*min] ) *min = cur_min;
if ( a[*max] < a[cur_max] ) *max = cur_max;
}
}
#define N 10
int main(void)
{
int a[N];
srand( ( unsigned int )time(NULL ) );
for ( size_t i = 0; i < N; i++ ) a[i]= rand() % ( 2 * N );
for ( size_t i = 0; i < N; i++ ) printf( "%d ", a[i] );
putchar( '\n' );
size_t min;
size_t max;
minmax_element( a, N, &min, &max );
printf( "The minimum is %d\n", a[min] );
printf( "The maximum is %d\n", a[max] );
return 0;
}
#include <stdio.h>
#include <assert.h>
int MinMaxArray(int arr[], int size, int *min){
assert(arr != NULL && size > 0);
if (size == 1){
*min = arr[0];
return arr[0];
}
int max = MinMaxArray(arr, size - 1, min);
if (arr[size - 1] < *min)
*min = arr[size - 1];
return (arr[size - 1] > max) ? arr[size - 1] : max;
}
int main(void) {
int arr[] = { 1,5,9,2,6,-4,8,3,7 };
int min, max = MinMaxArray(arr, sizeof(arr)/sizeof(*arr), &min);
printf("max:%d, min:%d\n", max, min);
return 0;
}