1

次のコードサンプルに多くの変数があり、その「型」が明確でない場合は事前にお詫びします。これは大きなライブラリです。ここにすべてを入れることはできません。 -レベル、そして変数の名前もちょっと役に立ちます...

問題: 「概念」は多くの「関係」を持つことができます。これらの関係のそれぞれにも多くの概念があります。たとえば、父と子のように、父親には多くの子供がいて、子供はそれ自体が父親であり、さらに多くの子供がいる可能性があります。すべての階層をファイルに書き込みます...

私が使用している高レベルのコードはこれです。問題は、子をもう持たない子を取得すると、Null 例外によってクラッシュすることです。したがって、そのオブジェクトは次の行で null です。

oUCMRConceptReltn = moTargetConceptList.ConceptReltns.get_ItemByIndex(i, false);

だから私はそれを周りにnullでないチェックを入れようと思いました.ええ、クラッシュを修正しますが、最初のリーフを見た後、それ以上進まず、アルゴリズムが停止します. だから私が再帰を呼んでいる方法に何か問題がありますが、それを理解することはできません.

private void MyLoadMethod(string sConceptCKI)
{
    UCMRConceptLib.UCMRConceptLoadQual oUCMRConceptLoadQual = new UCMRConceptLib.UCMRConceptLoadQual();

    //Fill out UCMRConceptLoadQual object to get new list of related concepts
    moTargetConceptList.Load(oUCMRConceptLoadQual;

    // WHEN IT IS ZERO, THERE ARE NO MORE CHILDREN.
    int numberofKids = moTargetConceptList.ConceptReltns.Count();
    if (numberofKids == 0)
        return ;
    for (int i = 1; i <= numberofKids; i++)
    {
        oUCMRConceptReltn = moTargetConceptList.ConceptReltns.get_ItemByIndex(i, false);

            //Get the concept linked to the relation concept
            if (oUCMRConceptReltn.SourceCKI == sConceptCKI)
            {
                oConcept = moTargetConceptList.ItemByKeyConceptCKI(oUCMRConceptReltn.TargetCKI, false);
            }
            else
            {
                oConcept = moTargetConceptList.ItemByKeyConceptCKI(oUCMRConceptReltn.SourceCKI, false);
            }

            //write its name to the file...now recursion: go and find its children.
            builder.AppendLine("\t" + oConcept.PrimaryCTerm.SourceString);
            MyLoadMethod(oConcept.ConceptCKI);
    }
    return ;
}
4

2 に答える 2

1

C スタイル言語のほとんどのインデックスは 0 ベースです。したがって、1 から numberofKids までループしないでください。0 から numberofKids-1 までループしてください。

for (int i = 0; i < numberofKids; i++)
于 2012-08-10T15:31:00.533 に答える
1

余談ですが、子供の数が 0 であるかどうかのチェックは冗長です。ループに入ることはないからです。

アルゴリズムは、あなたがやりたいことには問題ないようです。この場合、アルゴリズムは副作用 (appendLine) を使用して出力を提供するため、何も返す必要はありません。

C# はわかりませんが、 や など、関数に対してローカルではない変数を使用しているように見えoUCMRConceptReltnますoConcept。それらが関数に対してローカルでない場合、さまざまな再帰呼び出しによって、これらの値が予期しない方法で変更される可能性があります。再帰関数は、それ自体のスコープ外の変数に書き込むことはほとんどありません。

于 2012-08-10T17:53:12.803 に答える