Java 递推法的数学公式

Java 递推法的数学公式,java,recursion,Java,Recursion,我需要实现当前的公式。它用于对分类法中的节点进行评分。基本上,节点的分数取决于子节点的数量,它们的分数((节点(h+1))是下一级的节点数量,Cl(概念)是一组子节点) 在我的用例中,术语频率现在只为叶子定义。我已经做了一个实现,但问题是当节点有两个子节点时,实现只会转到一侧 对于给定的分类法: 1 / \ 2 3 | | 4 17 / \ 11 13 给出了频率:freq(11)=3,freq(13)=5和freq(17)=10。当我尝

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

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

对于给定的分类法:

     1
    / \
   2   3
   |   |
   4   17
  / \
 11 13
给出了频率:
freq(11)=3
freq(13)=5
freq(17)=10
。当我尝试获取
节点(1)
的分数时,结果是
0.0
,因为递归不会进入下一个
节点(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;
}
publicstaticfloatcalcscore(int-keyID、Map-frequencies、Map-subaxonomy){
浮点数res=0f;
int节点=0;
if(频率。containsKey(keyID)){
返回频率。获取(keyID)+0f;
}
for(Map.Entry:subTaxonomy.entrySet()){
if(entry.getValue()-1==subTaxonomy.get(keyID)){
节点++;
res+=calcScore(entry.getKey(),frequencies,subTaxonomy);
}
}
返回1/nodes*res;
}
注:

subTaxonomy
-在分类法中存储节点ID及其级别

频率
-存储叶节点的频率

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

我应该如何编辑代码,使其遍历给定节点的所有子节点

更新


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

您的问题位于这一行代码中

if (entry.getValue() - 1 == subTaxonomy.get(keyID)) {
树的左侧部分不符合您的预期约定,
childs id
(不是树的叶子)遵循公式
childs id=parents id-1

我建议更改您的实现,在分类法中包括
父id
,而不是
节点级别
。该级别可在重新恢复期间计数,并作为另一个参数传递

新签名可能如下所示:

public static float calcScore(int keyID, Map<Integer, Integer> frequencies, Map<Integer, Integer> subTaxonomy, int level)
publicstaticfloatcalcscore(int-keyID,Map-frequencies,Map-subTaxonomy,int-level)

进一步,您可以考虑从代码中删除<代码>级别>代码>信息,如果它对您的最终结果没有贡献的话!p> 副本

正确的方法

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

    for (Map.Entry<Integer, Integer> entry : subTax.entrySet()) {
        if (entry.getValue() == keyID) {
            res += calcScore(entry.getKey(), frequencies, subTax);
            nodes++;
        }
    }
    nodes--;
    return (float)1 / nodes * res;
}
publicstaticfloatcalcscore(int-keyID、Map-frequencies、Map-subTax){
浮点数res=0f;
int节点=1;
if(频率。containsKey(keyID)){
返回频率。获取(keyID)+0f;
}
对于(Map.Entry:subTax.entrySet()){
if(entry.getValue()==keyID){
res+=calcScore(entry.getKey(),frequencies,subTax);
节点++;
}
}
节点--;
返回(浮动)1/节点*res;
}


subTax
-映射是否包含
(子节点id,父节点id)

要获取子节点,您可以从映射中获取级别高于您感兴趣的节点级别的所有节点,对吗?@svasa是的,这基本上就是我正在做的。我得到给定节点的级别,在遍历时,我检查所有级别较低的节点,并将它们视为子节点,即在该节点上应用该方法。不应该是“代码>子分类”。(17, 3);代码>?@c0der,是的!我已经更新了代码和代码片段链接。必须是
(17,3)
(11,4)
(13,4)
。但是结果仍然是0.0,你的意思是
返回1/(nodes*res)?当然!但是
entry.getValue()
对于id==4的节点,由于通过
级别
的父规范不足,使得递归陷入困境!
级别对您的最终结果有什么影响?也许就不说了吧?我正要对此发表评论,当时我正在考虑在地图中存储的想法
(孩子,家长)
。我根本不需要最后的关卡。我想,我可以提供一个孩子的身份证,然后再进一步。听起来不错!如有任何疑问,请随时与我联系,然后单击“接受”按钮;)你为什么要污染答案部分?为什么不编辑你的第一个答案?不要因为我的评论而责怪我,但是:没有解决问题的过程的答案是有价值的维基内容/答案吗?这可能适用于具有“二进制”答案的问题,例如,规范文件为您提供了明确的答案,但我怀疑其是否适用于此处。。。(如果设计是一个关键方面)@PrR3,我很抱歉。通常我已经接受了你的答案,但后来一些版主把我的解决方案作为一个额外的答案,而我,可能,无意中点击了accepted@Cap绝对没有问题!在我看来,这两个答案的结合是最有价值的。