/// <summary>
        /// 检查指定节点下是否存在被选中的节点
        /// </summary>
        /// <param name="tn"></param>
        /// <returns></returns>
        private bool IsItemHasChecked(TreeNode tn)
        {
            if (tn.Nodes.Count > 0)
            {
                for (int i = 0; i < tn.Nodes.Count; i++)
                {
                    if (tn.Nodes[i].Checked == true)
                        return true;
                    else
                        IsItemHasChecked(tn.Nodes[i]):
                }
            }
            return false;
        }
具体业务场景见:http://blog.csdn.net/lusend/article/details/8350478,说说递归算法退出的原理

解决方案 »

  1.   

    递归退出其实只是在满足某种条件之后不再继续递归调用,同时层层return,直到完全结束该方法为止
      

  2.   

    中途return无用,只有不满足 tn.Nodes.Count>0才会退出
      

  3.   

    这个方法中途return不了,建议return true改为break;
      

  4.   

    你应该去看看递归的原理 return 是不起作用的,只有满足递归条件才会退出,你return 的只是他的一个副本而已
      

  5.   

    break是没法退出的,已经实验过了
      

  6.   

       private static Boolean boolean=false;        private bool IsItemHasChecked(TreeNode tn)
            {
                
                if (tn.Nodes.Count > 0)
                {
                    for (int i = 0; i < tn.Nodes.Count; i++)
                    {
                        if (tn.Nodes[i].Checked == true)
                        {
                            boolean = true;
                            break;
                        }
                        else
                            IsItemHasChecked(tn.Nodes[i]);
                    }
                }
                return boolean;
            }- -这样应该行
      

  7.   

       private static Boolean boolean=false;        private bool IsItemHasChecked(TreeNode tn)
            {
                
                if (tn.Nodes.Count > 0)
                {
                    for (int i = 0; i < tn.Nodes.Count; i++)
                    {
                        if (tn.Nodes[i].Checked == true)
                        {
                            boolean = true;
                        }
                        else{
                            boolean = IsItemHasChecked(tn.Nodes[i]);
                        }
                        if(boolean) break;
                    }
                }
                return boolean;
            }
    这样
      

  8.   

    if(IsItemHasChecked(tn.Nodes[i])==true){return true;}
    这里的确可以造成递归执行过程中退出,机制是怎样的?
      

  9.   

    class myE :Exception
    {
    }private bool IsItemHasChecked(TreeNode tn)
    {
    try
    {
       InternalIsItemHasChecked(tn);
    }
    catch(myE )
    {
        return true;
    }return false;}        private bool InternalIsItemHasChecked(TreeNode tn)        {            if (tn.Nodes.Count > 0)            {                for (int i = 0; i < tn.Nodes.Count; i++)                {                    if (tn.Nodes[i].Checked == true)                        throw new myE();                    else                        InternalIsItemHasChecked(tn.Nodes[i]):                }            }            return false;        }
      

  10.   


    /// 检查指定节点下是否存在被选中的节点
    /// </summary>
    /// <param name="tn"></param>
    /// <returns></returns>
    private bool IsItemHasChecked(TreeNode tn)
    {
        for (int i = 0; i < tn.Nodes.Count; i++)
        {
            if (tn.Nodes[i].Checked == true)
               return true;
            else
            {
                if (IsItemHasChecked(tn.Nodes[i]) == true)
                    return true;
            }
        }    return false;
    }
    代码没有测过,但是差不多应该是这个逻辑了,另外参数tn没有判断是否为null