2016-04-16 7 views
1

Ich mache ein rekursives Programm und während der Ausführung einer rekursiven Funktion zeigt es Stapelüberlauf Fehler. Ich kann nicht fortfahren, ohne diese rekursive Funktion abzuschließen. Bitte jemand mir helfen ... Dies ist der Code, den ich getan habe:Wie Stack-Overflow-Ausnahme in C# beim Aufruf einer rekursiven Funktion zu überwinden

public void blob(int k, int l, int[,] MV1) 
    { 
     while (true) 
     { 
      if ((MV1[k, l] == 1) && (status[k, l] != 1)) 
      { 
       count = count + 1; 
       if (count < 6000) 
       { 
        if (k < xmin) 
        { 
         X[Xr, 0] = k; 
         xmin = k; 
        } 
        if (l < ymin) 
        { 
         Y[Yr, 0] = l; 
         ymin = l; 
        } 
        if (k > xmax) 
        { 
         X[Xr, 1] = k; 
         xmax = k; 
        } 
        if (l > ymax) 
        { 
         Y[Yr, 1] = l; 
         ymax = l; 
        } 
        status[k, l] = 1; 


        if (l != (MV1.Length/MV1.GetLength(0)) - 1) 
        { 
         blob(k, l + 1, MV1); 
        } 
        if ((l != 0)) 
        { 

         blob(k, l - 1, MV1); 

        } 
        if (k != MV1.Length - 1) 
        { 
         blob(k + 1, l, MV1); 
        } 
        if ((k != 0)) 
        { 

         blob(k - 1, l, MV1); 

        } 

       } 
      } 
+0

Ich habe Ihre Bearbeitung zurückgesetzt. Sie können Ihre Frage nicht ändern, um sie inhaltlich zu ändern, sobald eine Antwort erfolgt ist. Die Antwort würde nach Ihrer Bearbeitung nicht länger gelten. Wenn Sie eine * neue * Frage haben, dann stellen Sie eine andere Frage, aber diese Frage muss nun so bleiben wie sie ist. Wenn Sie eine Klärung Ihrer Frage vorgenommen haben, die sie inhaltlich nicht ändert, können Sie sie ändern. –

+0

Eigentlich schrieb ich die while, um den Stapelüberlauffehler zu überprüfen. Aber bevor ich dir die Frage gestellt habe, habe ich vergessen zu entfernen, während (wahr). Das ist tatsächlich passiert. – Sreeraj

+0

Der Stack wird wahrscheinlich überflogen, weil Sie das Array MV1 (höchstens) 6000 mal auf den Stack setzen. Der [Stapel ist begrenzt] (http://stackoverflow.com/questions/28656872/why-is-stack-size-in-c-sharp-exactly-1-mb) Sie wissen. Sie können Ihren Code [in eine Iteration anstelle einer rekursiven Funktion] umschreiben (http://stackoverflow.com/questions/159590/way-to-go-from-recursion-to-iteration). – venerik

Antwort

1

Das Problem ist Ihre Methode nie die while Schleife beendet, weil Sie while (true) haben. Daher nennt sich Ihr rekursiver Algorithmus immer tiefer und tiefer, bis der Speicherplatz auf dem Stack aufgebraucht ist.

Sie müssen es so machen, dass Ihre Schleife an einem bestimmten Punkt, entweder von innerhalb return oder vorzugsweise mit einem besseren Zustand in Ihrer while Aussage.

Hinweis, es wird allgemein als schlechte Praxis angesehen, while (true) zu verwenden. Sie möchten dies vermeiden, es sei denn, es ist absolut notwendig.

+0

Ich entfernte die While (wahr). Immer noch trifft es die stackoverflow-Ausnahme. – Sreeraj

Verwandte Themen