1

如果以下代码示例中有很多变量您不清楚它们的“类型”,我提前道歉,这是一个很大的库,我不能把所有的东西都放在这里,所以请考虑一下-level,变量的名称也很有帮助......

问题:一个“概念”可以有很多“关系”。这些关系中的每一个也可以有很多概念,例如像父亲和孩子一样,父亲有很多孩子,孩子本身可能是父亲并且有更多孩子等等......所以我想通过根父亲得到所有层次结构并将其写入文件...

我正在使用的高级代码是这样的,问题是当它获得没有更多孩子的孩子时,它会因 Null 异常而崩溃。所以它的对象在这一行是空的:

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

所以我想好吧,让我们在它周围做一个非空检查,是的,在它看到第一片叶子之后修复了崩溃,它没有走得更远,算法停止了。所以我调用递归的方式有问题,但无法弄清楚。

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#,但在我看来,你好像在使用一些不是函数本地的变量,比如oUCMRConceptReltnand oConcept。如果它们不是函数本地的,则不同的递归调用可能会以意想不到的方式更改这些值。递归函数几乎不应该写入其自身范围之外的变量。

于 2012-08-10T17:53:12.803 回答