2016-05-03 17 views
0

私は再帰を使用して配列内の最小整数を見つけようとしています。最小配列の再帰を使用してC++

これは私のコードです:それと間違っている

int minArray(int* array, int size){ 
    if (size == 0){ 
     return array[0]; 
    } 
    int min = array[0]; 
    if (min > minArray(array+1,size-1)){ 
     min = minArray(array+1,size-1); 
    } 
    return min; 
} 

何? {1,2,3,4,5}の関数を呼び出すと、0が返されます。

+0

間違っている最初のものは、再帰が、このタスクに間違ったアプローチであるということです...私は再帰 – keshlam

+0

@keshlamは、それが – Bob

答えて

6

条件が間違っています。ゼロ要素の配列には要素がないため、array[0]にアクセスすることは不正です。

また、この関数で関数を2回呼び出すことは避けてください。

はこれを試してみてください:

int minArray(int* array, int size){ 
    if (size == 1){ 
     return array[0]; 
    } 
    int min = array[0]; 
    int candidate = minArray(array+1,size-1); 
    if (min > candidate){ 
     min = candidate; 
    } 
    return min; 
} 
+0

と練習のためにそれをやっている – Bob

+0

@Dannyを働くあなたに感謝、その機能を注意してください'size'がゼロの場合、UBにつながるでしょう。 –

+0

@RSahuので、if(size == 0)が0を返すようにする必要があります。 ? – Bob

0

このソリューションは、@MikeCatのものと類似しています。比較目的のために反復バージョンを追加しました。

int min(int str[], int size) 
{ 
    if (1==size) // base case 
    return str[0]; 
else { 
    int minor=min(&str[1],size-1); // each time the function is called its receives an array with an element less than the previous call. 
    return str[0]<=minor ? str[0] : minor; 
    } 
} 


// iterative approach. I have added the minor´s position indicator. 
int mini(int str[], int size, int* position) 
{ 
int minor=str[0]; 
for (int i=1;i<size;i++) 
    if (str[i]<minor) { 
    minor=str[i]; 
    *position=i; 
    } 
return minor; 
} 
関連する問題