数学公式为递归方法

Cap*_*Cap 12 java recursion

我需要实现当前的公式.它用于对分类中的节点进行评分.基本上,节点的分数取决于子节点的数量及其分数((nodes(h+1))是下一级节点的数量,Cl(concept)是一组子节点).

式

在我的用例中,术语频率仅定义为现在的叶子.我已经实现了一个实现,但问题是当节点有2个子节点时,实现只会转到一边.

对于给定的分类:

     1
    / \
   2   3
   |   |
   4   17
  / \
 11 13
Run Code Online (Sandbox Code Playgroud)

的频率被给定:freq(11) = 3,freq(13) = 5freq(17) = 10.当我试图获得分数时node(1),结果是0.0,因为递归不会进入后代node(4),它只检索freq(17)它就是它.通常,结果应为7.

这是实施:

public static float calcScore(int keyID, Map<Integer, Integer> frequencies, Map<Integer, Integer> subTaxonomy) {
    float res = 0f;
    int nodes = 0;
    if (frequencies.containsKey(keyID)) {
        return frequencies.get(keyID) + 0f;
    }

    for (Map.Entry<Integer, Integer> entry : subTaxonomy.entrySet()) {
        if (entry.getValue() - 1 == subTaxonomy.get(keyID)) {
            nodes++;
            res += calcScore(entry.getKey(), frequencies, subTaxonomy);
        }
    }
    return 1 / nodes * res;
}
Run Code Online (Sandbox Code Playgroud)

注意:

subTaxonomy - 将nodeID及其级别存储在分类中

frequencies - 存储叶节点的频率.

我还在Ideone:Source创建了一个片段

我应该如何编辑代码,以便它遍历给定节点的所有子代?

UPDATE

所以现在,在更新的源代码中,它遍历所有分类法,但结果仍为0.0.

PrR*_*rR3 1

你的问题就出在这行代码

if (entry.getValue() - 1 == subTaxonomy.get(keyID)) {
Run Code Online (Sandbox Code Playgroud)

树的左侧部分不符合您预期的约定,即childs id(不是树的叶子)遵循公式childs id = parents id - 1

我建议更改您的实施,包括parents id分类法中的 ,而不是node level. 可以在递归期间对级别进行计数并作为另一个参数传递。

新签名可能如下所示:

public static float calcScore(int keyID, Map<Integer, Integer> frequencies, Map<Integer, Integer> subTaxonomy, int level)
Run Code Online (Sandbox Code Playgroud)

level此外,如果它对您的最终结果没有贡献,您可以考虑从代码中删除该信息!