none
递归问题 RRS feed

  • 问题

  • 节点1 权重(xx%)
      节点1-1 权重(xx%)
         节点1-1-1 权重(xx%)
             节点1-1-1-1 (2.6)  权重(25%) 乘  值(2.6)  = 分数 
             节点1-1-1-2 (2.6)  权重(25%) 乘  值(2.6)  = 分数   
         节点1-1-2  权重(25%) 乘  值(2.6) = 分数
         节点1-1-3  权重(25%) 乘  值(2.6) = 分数
         节点1-1-4  权重(25%) 乘  值(2.6) = 分数
      节点1-2 权重(xx%)
      节点1-3 权重(xx%)
      节点1-4 权重(xx%)
      ....
      

    在上面的节点中, 每一个节点都有一个权重, 每一个最后一级节点都会有一个值, 最终的目的是要算出节点1的分数。现在的想法是当递归到 节点1-1就获取它的所有子节点的值和权重分别汇集成两个数组,把这两个数组作为参数,传给“  加权和法(子节点权重数组,子节点的值数级)”, 然后这个加权和法经过运算返回一个decimal类型的值,这个值就是节点1-1 的值再乘以它的权重就是它的分数。

    换个角度想: 节点1-1-2 到 节点1-1-4 是最后一级节点,可以把它们的各自的权重和值当作是只有一个数的数组传给加权和法计算,得到结果返回给节点1-1, 但是节点1-1-1 要先算出它每个子节点的分数,然后累加乘它的权重,才是节点1-1-1 的分数, 节点1-1-1 的分数加上节点1-1-2到节点1-1-4,就是 节点1-1 的值乘以它的权重=它的分数。

    问题是当递归到节点1-1-4 ,就返回到节点1-1了, 节点1-1-1 的分数,应如何处理?

    public void Tree(int nodeid)
    {
       //获得当前节点下所有子节点的数据
       List<节点实体信息> list = Bll.GetSubNodeByParentid(nodeid)
      foreach(节点实体信息 info in list )
      {
         //如果不是子节点,继续递归
         if(info.child > 0)
         {
           
            //如果当前节点下的子节点,有的是最后一级,有的子节点还有子节点,是不是应该在这里判断, 应该如何判断
            //继续递归
            Tree(info.NodeId);
         }
         else  如果是子节点
         {
             //权重数组
             List<decimal> listw = new List<decimal>();
            
             //标准值数组
               List<decimal> listz = new List<decimal>();
                
            //最后一级的权重
            decimal qz = info.Qz; 
            
            //最后一级标准值
              decimal val = info.BzZ;
                  
            listw.Add(qz);
            listz.Add(val);
            //这里算出最后一级分数后,应该如果返回给父级,不知道怎么处理
            decimal fs = 加权和法(listw,listz)
         }
      }
    }

    2013年6月18日 17:00

答案

  • 思路是这样:

    1)内部的递归循环是——遍历每一个节点,直到其子节点没有子节点。然后返回这个节点的计算值(函数应该是有返回值的)。

    2)参考实现(伪代码):

    public decimal Tree(Node node)
    {
        decimal total = 0;
    
        if(node.Children.Count==0)
        {
           return node.Value; //直接返回这个node的Value(decimal)
        }
        foreach(Node subnode in node.Children)
        {
            //递归调用
           total+=Tree(subnode);
        }
        return total;
    }

    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats


    Found any spamming-senders? Please report at: Spam Report

    2013年6月19日 1:38
    版主

全部回复