1

これは私の再帰関数です:

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;
}

私はそれを呼び出すところから、常にfalseを取得するようにアスペクトします(return false関数の最後にあるが、返される最後の結果になります)。

実際、trueを返すこともあります。

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

4

4 に答える 4

3

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

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

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

于 2012-04-11T20:45:43.723 に答える
1

これは最初の反復でのみ発生する可能性があると思います。つまり、最初の比較だけでtrueが返される可能性があります。その場合、再帰呼び出しは発生しません。

于 2012-04-11T20:50:48.100 に答える
0

このコードブロックは、関数の最初の呼び出し(ループの最初の呼び出し)では決して真にならないということですか?

k_oSottoPagina.ID == k_oPaginaAttuale.ID

再帰呼び出しの結果を返さないため、関数はスタックをブローするか、ある時点で最初のループを介してtrueを返すか、ループを終了してfalseを返します。

于 2012-04-11T20:45:15.477 に答える
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;
}
于 2014-08-20T05:28:07.600 に答える