2017-05-27 147 views
-4

我想寫一個遞歸函數,它將一個數組作爲參數並返回MIN和MAX值。到目前爲止,我只能得到MAX。我試圖添加一個指針來發回最小值,但由於某種原因,它總是崩潰並顯示大量警告C - 遞歸指針

請幫我弄清楚我的代碼有什麼問題。

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); 
} 
+1

'&min' - >'min'。 – BLUEPIXY

+2

爲什麼你有第三個說​​法?你從不使用它。 – Beta

+0

...哦,並將'>'更改爲'<'。 – Beta

回答

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; 
} 
+0

什麼是「斷言」我可以沒有它嗎? –

+0

@ monkey.D.Ganga _can我可以不用它嗎?_ yes刪除它或者發表評論''assert(arr!= NULL && size> 0);' – BLUEPIXY

+0

'assert'是條件滿足的斷言這個功能。如果條件不滿足,則會顯示並中止錯誤消息。 – BLUEPIXY

0

呼叫

MinMaxArray(arr, (size - 1), &min) 

指定的第三個參數具有相對於參數聲明類型錯誤。

參數的類型爲int **,而參數的類型爲int *

此外,不計算最小元素。

在C++中有一個名爲minmax_element的標準算法,它返回一對指向數組最小元素的指針。

你可以使用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; 
} 

它的輸出可能看起來像

14 6 7 9 6 7 15 12 0 10 
The minimum is 0 
The maximum is 15 

考慮到用戶可以通過函數是一個「空」數組,即與數組大小相對應的參數等於0時的數組。在這種情況下,您自己的函數實現具有未定義的行爲。

如果不可以使用結構,那麼該函數可以聲明如下

void minmax_element(const int a[], size_t n, size_t *min, size_t *max); 

或者

void minmax_element(const int a[], size_t n, int **min, int **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; 
} 
+0

wtf?我不知道C++我正在編程C ..... C !!!!!!!!!!!!!!!!!!!!!!!!!!!! –

+0

@ monkey.D.Ganga我向你展示了一個在C中實現的函數。重新閱讀我的文章。 –

+0

這是複雜的,我感謝你的工作。但它不是我所問的,肯定有很多方法可以使這個MIN&MAX函數,但我只能使用遞歸,並且必須使它儘可能簡單 –