代码之家  ›  专栏  ›  技术社区  ›  Iain Holder

为什么这个递归在C#中不起作用?

  •  3
  • Iain Holder  · 技术社区  · 16 年前
    public static bool AllNodesChecked(TreeNodeCollection nodes)        
    {
        foreach (TreeNode node in nodes)
        {
            if (!node.Checked)
            {
                return false;
            }
            AllNodesChecked(node.Nodes);
        }
        return true;
    }
    

    A1(checked) -> B1(unchecked)
    A2(checked)
    A3(checked)
    

    但当它到达节点B1时就不会返回了。

    编辑:谢谢大家帮助我疲惫的大脑。只有在冷水淋浴后的一天的早些时候才应该尝试复发。

    6 回复  |  直到 16 年前
        1
  •  20
  •   Mehrdad Afshari    16 年前

    AllNodesChecked 在递归调用中:

    public static bool AllNodesChecked(TreeNodeCollection nodes)        
    {
        foreach (TreeNode node in nodes)
            if (!node.Checked || !AllNodesChecked(node.Nodes))
               return false;
        return true;
    }
    

    这个 return 语句只从 现在的

        2
  •  8
  •   Klaus Byskov Pedersen    16 年前

    更改:

    AllNodesChecked(node.Nodes); 
    

    收件人:

    if(!AllNodesChecked(node.Nodes))
        return false;
    
        3
  •  7
  •   Eric Lippert    16 年前

    我会采取稍微不同的方法。我要做的是首先编写代码,将您的树(我假设它实际上是一棵树,而不是一个任意图形)转换为 序列

    static IEnumerable<Node> AllNodes(this Node node)
    {
        var stack = new Stack<Node>();
        stack.Push(node);
        while(stack.Count > 0)
        {
            var current = stack.Pop();
            yield return current;
            foreach(var child in current.Nodes)
                stack.Push(child);
        }
    }
    

    现在可以使用序列运算符:

    bool allChecked = root.AllNodes().All(x=>x.Checked);
    

        4
  •  3
  •   markalex    16 年前

    您没有计算检查子节点的递归调用的结果。

        5
  •  2
  •   David Gladfelter    16 年前

    试试这个:

    public static bool AllNodesChecked(TreeNodeCollection nodes)         
    { 
        foreach (TreeNode node in nodes) 
        { 
            if (node.Checked == false || !AllNodesChecked(node.Nodes)) 
            { 
                return false; 
            } 
        } 
        return true; 
    } 
    
        6
  •  -1
  •   Squirrelsama    15 年前

    public static bool AllNodesChecked(TreeNodeCollection nodes)  
    {
        return nodes.All(i => i.Checked && AllNodesChecked(i.Nodes));
    }