2017-09-29 10 views
-3

Étant donné un tableau non trié, recherchez les valeurs max et min. J'essaye de le faire d'une manière récursive, diviser et conquérir mais je continue à obtenir une erreur de débordement de pile. J'ai débogué et je continue d'obtenir l'erreur dans mes appels récursifs, mais je ne sais pas ce qui ne va pas ou comment le réparer.Récursif - erreur de dépassement de pile

J'ai des variables statiques min et max.

Merci pour l'information et l'aide!

static void findMaxMin(int[] array, int start, int end) 
{ 
    if (end == 2) 
    { 
     setMaxMin(array); 
    } 
    else 
    { 
     int mid = ((end)/2); 
     findMaxMin(array, start, mid); 
     findMaxMin(array, mid + 1, end); 
    } 
} 
private static void setMaxMin(int[] array) 
{ 
    if (array[0] > array[1]) 
    { 
     max = array[0]; 
     min = array[1]; 
    } 
    else 
    { 
     min = array[0]; 
     max = array[1]; 
    } 
} 
+0

Semble vous manque le point de sortie, vous devez dire quand le code doit Arrêtez. Par exemple start> = end. – Prisoner

+0

Je soupçonne dans votre état de base de la récursivité. –

+0

Eh bien 'setMaxMin' ne regarde jamais que les deux premiers index, donc comment cela fonctionnera si le tableau est plus long, – juharr

Répondre

0

Voici une façon simple de le faire (sans récursivité):

void FindMinAndMaxValues(int[] array out int min, out int max) 
{ 
    min = int.MaxValue, 
    max = int.MinValue; 

    foreach(var val in array) 
    { 
     max = (val > max) ? val : max; 
     min = (val < min) ? val : min; 
    } 
} 

S'il vous plaît noter que je suis en utilisant des paramètres ici. Ceci est fait pour la simplicité du code. Habituellement, je préfère soit retourner une classe désignée ou tuple.

En outre, LINQ a min et max méthodes d'extension que vous pouvez utiliser - si la chose entière se tourne vers quelque chose comme ceci:

var max = array.Max(); 
var min = array.Min();