2016-07-21 11 views
0

Entschuldigung für diese grundlegende Frage, aber es hat schon ein paar Stunden von mir gedauert. Ausgabe: rechts ein Feld für die angegebenen Schritte, um zu verschieben Hier ist der Code:Rekursive Funktion nicht wie erwartet gestoppt

static int[] ShiftRight(int[] arr, int shiftTimes) 
    { 
     if (shiftTimes == 0 || arr.Length == 0 || arr.Length == 1) return arr; 

     var resultArray = new int[arr.Length]; 

     for (var i = 1; i < arr.Length; i++) 
      resultArray[i] = arr[i - 1]; 

     resultArray[0] = arr[resultArray.Length - 1]; 

     while (shiftTimes > 1) 
     { 
      shiftTimes--;  
      ShiftRight(resultArray, shiftTimes); 
     }    

     return resultArray; 
    } 

Problem: Obwohl der while Ausdruck ist dort die Rekursion zu kontrollieren, aus unerfindlichen Gründen nach den return resultArray; erreicht Zeile, das Programm geht zurück auf die while Ausdruck, so dass es ein falsches Ergebnis gibt! Dieses Verhalten ist beim Debuggen sichtbar.

Die Methodensignatur darf nicht geändert werden.

Jede Hilfe sehr geschätzt.

+2

Entweder Schleife oder rekursiv - wählen Sie eine – pm100

+0

Ersetzen Sie die while mit if. Vielleicht könnte es funktionieren. – MyIsaak

+0

@MyIsaak: nur ersetzen, aber immer noch das falsche Ergebnis - es muss sonst noch wo ich den Fehler mache! – Ali

Antwort

2

Sie versuchen, sowohl eine Schleife als auch eine Rekursion zu verwenden. Entfernen Sie die while-Schleife und geben Sie die Funktion selbst mit der aktualisierten Variable shiftTimes zurück.

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     int[] arr = ShiftRight(new int[] { 1,2,3,4,5,6,7,8,9,10}, 2); 
     Console.WriteLine(String.Join(",",arr)); 
    } 

    static int[] ShiftRight(int[] arr, int shiftTimes) 
    { 
     if (shiftTimes == 0 || arr.Length == 0 || arr.Length == 1) return arr; 

     var resultArray = new int[arr.Length]; 

     for (var i = 1; i <= arr.Length; i++) 
      resultArray[i%arr.Length] = arr[i - 1]; 

     return ShiftRight(resultArray, --shiftTimes); 
    } 
} 
4

Sie brauchen die while-Schleife überhaupt nicht. Rekursion ist alles was Sie hier brauchen - es wird sicherstellen, dass das Array erneut durchlaufen wird, bis die Stop-Klausel (shiftTimes == 0) erreicht ist.

Beachten Sie, dass die variablen shiftTimes, die in rekursiven Aufrufen verringert wird nicht an die aufrufende Umgebung reflektiert wird - das Argument von Wert übergeben wird, so wird eine neue Kopie davon gemacht wird und nur die Kopie wird bei jedem neuen Aufruf verringert ShiftRight.

Sie auch nichts mit dem Rückgabewert des rekursiven Aufrufs tun, sollten Sie es zurückgeben.

+0

der zweite Absatz war so nützlich für mich - danke. Über den ersten Absatz, meinst du, ich sollte "während" durch "wenn" ersetzen und dann ist es in Ordnung? obwohl ich das immer noch falsch gemacht habe - was für einen Teil verwechsele ich? – Ali

+0

@AliAshoori Sie brauchen nicht einmal das if, weil Sie die Stop-Klausel haben, wenn 'shiftTimes == 0', geben Sie einfach das Eingabe-Array zurück - das ist das gleiche. (Hinzufügen der if ist nicht falsch, aber es ist nicht erforderlich). – amit

+0

OMG, Sie haben Recht, haben Sie bereits die Stopp-Klausel am Anfang. Es ist enttäuschend, aber immer noch falsch Ergebnis :-( – Ali