2016-05-23 8 views
0

Also habe ich versucht, Rekursion bisher zu üben und ich blieb stecken.Boolesche Rekursionsmethode

Ich muss eine Methode schreiben, die Art von bool ist und zwei Parameter (Array von Ints und Int). Die Methode selbst sollte prüfen, ob Zahlen im Array größer als 1000 sind.

Abhängig vom zweiten Parameter sollten nur diese Zahlen überprüft werden. Wenn also das Array 4, 5, 1001, 1003 ist und der zweite Parameter 3 ist, sollten nur die ersten 3 Werte im Array überprüft werden (4,5,1001). In diesem Fall sollte es false zurückgeben, weil 4 und 5 kleiner als 1000 sind. Aber wenn die ersten 3 Werte größer als 1000 sind, sollte die Methode wahr ergeben.

Dies sind die Reste meiner Methode. Ich habe es schon oft versucht.
Ich bin ein wenig verwirrt, wie es mit arbeiten soll.

public bool sumofD(int [] x , int n) 
{ 
    if (x[n] < 1000) 
     { return false; } 
    else 
    { 
     sumofD(x, n - 1); 
     return true; 
    }    
} 
+0

Sie möchten 'sumofD (x, n-1)' sicher zurückgeben? Hier sagst du, bis 'x [n] <1000 'weiterhin' n-1' ausführt. Eine while-Schleife würde dieser Situation besser entsprechen –

+0

Ich muss wahr oder falsch zurückgeben, aber die Methode sollte rekursiv geschrieben werden – Alex

+0

Sie könnten diese besser lesbare LINQ-Version verwenden: 'bool allGreaterEqual1000 = x.Take (n-1) .All (i => i> = 1000) ' –

Antwort

4

Es ist kein gutes Beispiel für Rekursion, da es einfacher wäre, einfach throug das Array zu durchlaufen.

Wie auch immer, Sie haben die Endbedingung für Ihre Rekursion vergessen. Sie mögen die Rekursion, wenn n < 0 stoppen:

public bool sumofD(int [] x , int n) 
{ 
    // check if you already checked all values 
    if (n <= 0) return true; 
    if (x[n - 1] < 1000) // use n-1 
     { return false; } 
    else 
     // return if all the leading values are > 1000 
     return sumofD(x, n - 2); 
} 

Und Ihr zweiter Fehler war, immer return true egal, was Ihr rekursiven Aufruf zurückgegeben.

Ich änderte den Code, der das Ergebnis Ihres rekursiven Aufrufs zurückgibt, semantisch meaing: "Wenn der aktuelle Wert größer als 1000 ist, geben Sie das Ergebnis der Prüfung für die führenden Werte zurück".


aktualisieren: Wenn n die Anzahl der Elemente zu überprüfen, möchten Sie bei x[n-1] starten, da Arrays 0-indiziert sind. Und ändern Sie die anderen Verwendungen von n entsprechend (Überprüfung n <= 0 vor und Aufruf rekursiv mit n-2).

1

Ich denke, das sollte funktionieren;

public static bool sumofD(int[] x, int n) 
    { 
     n -= 1; 
     if (n < 0) return true; 
     return x[n] >= 1000 && sumofD(x, n - 1); 
    }