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-递归_C_Pointers_Recursion - Fatal编程技术网

带指针的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;
}