2012-04-11 11 views
0

Dies ist meine rekursive Funktion:Wie kann diese rekursive Funktion true zurückgeben?

public bool controllaSelezioneSottopagina(KPage k_oPaginaAttuale, KPage k_oPaginaSuperiore) 
{ 
    foreach (KPage k_oSottoPagina in k_oPaginaSuperiore.SottoPagine) 
    { 
     if (k_oSottoPagina.ID == k_oPaginaAttuale.ID) 
     { 
      return true; 
     } 
     else 
     { 
      if (k_oSottoPagina.SottoPagine.Count != 0) 
      { 
       controllaSelezioneSottopagina(k_oPaginaAttuale, k_oSottoPagina); 
      } 
     } 
    } 

    return false; 
} 

I Aspekt, von wo ich es nennen, zu immer falsch zu bekommen (die return false am Ende der Funktion wird das letzte Ergebnis sein, das jemals zurückgegeben werden) .

In der Tat, manchmal gibt es wahr zurück.

Wie ist es möglich? Debugging versucht ... aber ich kann den Fehler nicht herausfinden ...

+0

Könnten Sie die Definition der 'KPage' Klasse zu veröffentlichen, und zeigen, wie Sie' controllaSelezioneSottopagina' rufen zu den falschen Rückgabewert verursachen? –

+6

Sie müssen den rekursiven Aufruf zurückgeben. – SLaks

+0

vielleicht .. für die erste k_oSottoPagina die 'if (k_oSottoPagina.ID == k_oPaginaAttuale.ID)' ist wahr? – nothrow

Antwort

3

Sie rufen die Funktion einmal auf, dann führt sie eine Schleife aus und gibt entweder true zurück oder ruft rekursiv auf. Es gibt nur false zurück, wenn es alle Elemente durchläuft und die Bedingung (k_oSottoPagina.ID == k_oPaginaAttuale.ID) niemals erfüllt wird.

Nun wird angenommen, dass diese Bedingung in der ersten Ebene tatsächlich erfüllt ist (es wurde noch keine Rekursion durchgeführt oder alle rekursiven Aufrufe werden zurückgegeben).

Sie rufen die Funktion einmal auf, es wird eine Schleife ausgeführt und zum Beispiel beim ersten Test ist diese Bedingung wahr. Dann sehen Sie einen Rückgabewert 'wahr'

0

Sie sagen, dass dieser Code-Block wird nie wahr sein, im ersten Aufruf der Funktion (das erste Mal durch die Schleife)?

k_oSottoPagina.ID == k_oPaginaAttuale.ID 

Da Sie nicht das Ergebnis des rekursiven Aufrufs zurückkehren, Ihre Funktion entweder bläst den Stapel, gibt true zurück durch die erste Schleife an einem gewissen Punkt, oder beendet die Schleife und gibt false zurück.

+0

Nicht ganz, es wird nur wahr zurückgegeben, wenn die IDs beim ersten Aufruf übereinstimmen, weil er das Ergebnis seines rekursiven Aufrufs nicht zurückgibt, wenn er macht immer einen rekursiven Aufruf (von seiner Struktur) wird es falsch zurückgeben. –

+0

@James Michael Hare: erneut mit dem Debugger überprüft. Der erste Anruf stimmt nicht mit den IDs überein. Also, die Rekursion startet. Than, ich werde wahr: O Deshalb habe ich dieses Thema geöffnet ... – markzzz

+0

Wie einige Leute erwähnt haben, sollten Sie das Ergebnis des rekursiven Aufrufs zurückgeben, sonst jedes Mal, wenn der obige Test in der ursprünglichen Schleife übereinstimmt, wird wahr zurückgegeben. – yamen

1

Ich denke, das könnte nur in der ersten Iteration passieren. Ich meine, dass nur der erste Vergleich dazu führen kann, dass er wahr wird. Rekursiver Aufruf würde dann nie passieren.

+0

Nein! Tatsächlich gibt es nach Eingabe der Rekursion den Wert true zurück. Das ist seltsam... – markzzz

0

eine weitere Alternative Druck falsch nicht falsch in den Fällen, in denen es in der Schleife gehen tut, ist

public bool controllaSelezioneSottopagina(KPage k_oPaginaAttuale, KPage k_oPaginaSuperiore) 
{ 
    foreach (KPage k_oSottoPagina in k_oPaginaSuperiore.SottoPagine) 
    { 
     if (k_oSottoPagina.ID == k_oPaginaAttuale.ID) 
     { 
      return true; 
     } 
     else 
     { 
      if (k_oSottoPagina.SottoPagine.Count != 0) 
      { 
       if(controllaSelezioneSottopagina(k_oPaginaAttuale, k_oSottoPagina)) 
       { 
        return true; 
       } 
      } 
     } 
    } 

    return false; 
} 
Verwandte Themen