2012-04-11 8 views
0

これは私の再帰関数である:私はそれを呼び出すところからこの再帰関数はどのように真を返すことができますか?

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アスペクト、常にfalseを取得する(関数の最後でreturn falseは、EVER、返される最後の結果になります) 。

実際、時にはtrueを返すことがあります。

どうすれば可能ですか?デバッグを試みました...しかし、私は間違いを見つけることができません...

+0

あなたは 'KPage'クラスの定義を掲示し、あなたが' controllaSelezioneSottopagina'を呼び出しているかを示すことができたです偽の戻り値を引き起こしますか? –

+6

再帰呼び出しを '返す '必要があります。 – SLaks

+0

多分..最初のk_oSottoPaginaのために 'if(k_oSottoPagina.ID == k_oPaginaAttuale.ID)'が本当ですか? – nothrow

答えて

3

関数を1回呼び出すとループし、trueを返すか、呼び出しを繰り返し呼び出します。すべての要素をループし、条件(k_oSottoPagina.ID == k_oPaginaAttuale.ID)が決して満たされない場合にのみ、falseを返します。

ここで、この条件が実際に第1レベルで満たされていると仮定します(まだ再帰が行われていないか、すべての再帰呼び出しが返されていません)。

関数を1回呼び出すとループし、たとえば最初のテストではこの条件が真です。戻り値 'true'が表示されます

0

このコードブロックは、関数への最初の呼び出し(ループをはじめて)では決して真実ではないでしょうか?

k_oSottoPagina.ID == k_oPaginaAttuale.ID 

あなたは再帰呼び出し、あなたの関数のいずれかのスタックを吹く、いくつかの点で最初のループを通ってtrueを返す、またはループを終了し、falseを返すの結果を返しませんので。

+0

再帰呼び出しの結果を返さないため、IDが最初の呼び出しで一致した場合のみtrueを返します。 (構造体から)再帰呼び出しを行うと、falseを返します。 –

+0

@James Michael Hare:デバッガで再度チェックします。最初の呼び出しはIDと一致しません。だから、再帰開始。私はこのトピックを開いたのです。 – markzzz

+0

いくつかの人が言及しているように、再帰呼び出しの結果を返す必要があります。そうでなければ、元のループ内の上記のテストが真を返すでしょう。 – yamen

1

これは最初の繰り返しでのみ発生する可能性があると思います。私は最初の比較だけが真を返すことになることを意味します。再帰的呼び出しは決して起こりません。

+0

いいえ!実際には、再帰で入力した後はtrueを返します。それは奇妙だ... – markzzz

0

別の代替することは、それがループに行くん場合はfalseを間違って印刷しないようにすることは

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; 
} 
関連する問題