递归算法无法中途跳出

lusens 2012-12-20 05:22:50
        /// <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,说说递归算法退出的原理
...全文
402 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
DrSmart 2013-09-27
  • 打赏
  • 举报
回复
引用 8 楼 sp1234 的回复:
你用什么神奇机器,不会出现“堆栈溢出”错误么?
不懂,别乱讲
BinaryTreeEx 2012-12-28
  • 打赏
  • 举报
回复

/// 检查指定节点下是否存在被选中的节点
/// </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
luxin10 2012-12-27
  • 打赏
  • 举报
回复
抛异常的确可以跳出,受教了!
stonespace 2012-12-25
  • 打赏
  • 举报
回复


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;        }
stonespace 2012-12-25
  • 打赏
  • 举报
回复
有一个简单的办法,可以一次性跳出所有递归,就是抛出一个异常,在递归的外面抓异常,这个代码就不用写了,很简单有效的方法,
yann_2012 2012-12-25
  • 打赏
  • 举报
回复
顶一下!!
lusens 2012-12-21
  • 打赏
  • 举报
回复
自己顶一下!!
lusens 2012-12-21
  • 打赏
  • 举报
回复
if(IsItemHasChecked(tn.Nodes[i])==true){return true;} 这里的确可以造成递归执行过程中退出,机制是怎样的?
lusens 2012-12-20
  • 打赏
  • 举报
回复
仔细看了一下递归的原理,递归在计算过程中是一个入栈和出栈的过程,这里有一句话总结得很好:递归一定有一个终止条件,不到达这个终止条件递归是不会停止。如果到达了终止条件,递归就会返回上一层,利用上一层的变量进行相关操作。如果上一层还有其他路径的递归,则按照其他路径一路递归到底,然后返回,在逐层返回的过程中,在每层利用该层的变量完成相关的操作。
  • 打赏
  • 举报
回复
你用什么神奇机器,不会出现“堆栈溢出”错误么?
Marky 2012-12-20
  • 打赏
  • 举报
回复
   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;
        }
这样
游离失所 2012-12-20
  • 打赏
  • 举报
回复
   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;
        }
- -这样应该行
lusens 2012-12-20
  • 打赏
  • 举报
回复
break是没法退出的,已经实验过了
q312977 2012-12-20
  • 打赏
  • 举报
回复
你应该去看看递归的原理 return 是不起作用的,只有满足递归条件才会退出,你return 的只是他的一个副本而已
Marky 2012-12-20
  • 打赏
  • 举报
回复
这个方法中途return不了,建议return true改为break;
bdmh 2012-12-20
  • 打赏
  • 举报
回复
中途return无用,只有不满足 tn.Nodes.Count>0才会退出
Marky 2012-12-20
  • 打赏
  • 举报
回复
递归退出其实只是在满足某种条件之后不再继续递归调用,同时层层return,直到完全结束该方法为止

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧