如何在c#中停止执行递归函数 [英] How to stop execution of recursive function in c#

查看:680
本文介绍了如何在c#中停止执行递归函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

嗨我想停止执行当前的递归函数,但循环重复使用相同的值,我尝试使用下面的代码



< pre lang =c#> protected void BottomSearch( String AncestorFamilyID,ArrayList RelationPath)
{
ArrayList bottomMembers = new ArrayList();
ArrayList l2 = new ArrayList();

int depth = 0 ;

if (++ depth < 10
{
var aff = AncestorFamilyID.Cast< string>()。ToArray();
字符串 AFamilyID = 字符串 .Join( ,aff);

sSQL = SELECT DISTINCT AF_MemberID FROM AllFamily_Master;
sSQL = sSQL + WHERE AF_FamilyID IN( + AncestorFamilyID + ;

DS2 = new DataSet();
da2 = new OdbcDataAdapter(sSQL,conn);
da2.Fill(DS2);

if (DS2.Tables.Count > 0
{
if (DS2.Tables [ table]。Rows.Count > 0
{
for int i = 0 ; i < DS2.Tables [ table]。Rows.Count; i ++)
{
bottomMembers.Add(DS2.Tables [ table]。行[i] [ AF_MemberID]的ToString());
}
}
}
DS2.Dispose();
da2.Dispose();

字符串 m1 = 字符串 .Join( ,bottomMembers.Cast< string>()。ToArray());

sSQL = SELECT AF_FamilyID FROM AllFamily_Master;
sSQL = sSQL + WHERE AF_MemberID IN( + m1 + ;
sSQL = sSQL + AND AF_MemberType IN('H');

DS3 = new DataSet();
da3 = new OdbcDataAdapter(sSQL,conn);
da3.Fill(DS3);

if (DS3.Tables.Count > 0
{
if (DS3.Tables [ table]。Rows.Count > 0
{
for int k = 0 ; k < DS3.Tables [ table]。Rows.Count; k ++)
{

BottomSearch(DS3.Tables [ table]。行[k] [ AF_FamilyID]。的ToString(),Relati onPath);
}
}
}
DS3.Dispose();
da3.Dispose();

if (CompareArrayList(bottomMembers,(lblUserToMemberID.Text.ToString())))
{
List<串GT; str1 = FindTargetMember(bottomMembers,lblUserToMemberID.Text.ToString());

RelationPath.Add(str1);
return ;
}

}

解决方案

这总是递归的。



您可能要做的是将深度变量传递给您的方法。现在,在你的方法中你这样做:

  int  depth =  0 ; 
if (++ depth < 10 ){ / * ... * / }





因此if语句总是如此。你应该做的是传递depth参数做你的递归方法,作为ref参数。像这样:

 受保护  void  BottomSearch ( String  AncestorFamilyID,ArrayList RelationPath, ref   int 深度)
{
if (++ depth < 10 ){}
}





当深度为10时,它'不要输入if语句,不再以递归方式调用此方法。


Hi I want to stop the execution of current recursive function,but the loop repeats again and again with the same value,I have tried with below code

protected void BottomSearch(String AncestorFamilyID, ArrayList RelationPath)
    {
        ArrayList bottomMembers = new ArrayList();
        ArrayList l2 = new ArrayList();

        int depth = 0;

        if (++depth < 10)
        {
            var aff = AncestorFamilyID.Cast<string>().ToArray();
            String AFamilyID = String.Join(",", aff);

            sSQL = "SELECT DISTINCT AF_MemberID FROM AllFamily_Master";
            sSQL = sSQL + " WHERE AF_FamilyID IN(" + AncestorFamilyID + ")";

            DS2 = new DataSet();
            da2 = new OdbcDataAdapter(sSQL, conn);
            da2.Fill(DS2);

            if (DS2.Tables.Count > 0)
            {
                if (DS2.Tables["table"].Rows.Count > 0)
                {
                    for (int i = 0; i < DS2.Tables["table"].Rows.Count; i++)
                    {
                        bottomMembers.Add(DS2.Tables["table"].Rows[i]["AF_MemberID"].ToString());
                    }
                }
            }
            DS2.Dispose();
            da2.Dispose();

            String m1=String.Join(",",bottomMembers.Cast<string>().ToArray());

            sSQL = "SELECT AF_FamilyID FROM AllFamily_Master";
            sSQL = sSQL + " WHERE AF_MemberID IN("+m1+")";
            sSQL = sSQL + " AND AF_MemberType IN('H')";

            DS3 = new DataSet();
            da3 = new OdbcDataAdapter(sSQL, conn);
            da3.Fill(DS3);

            if (DS3.Tables.Count > 0)
            {
                if (DS3.Tables["table"].Rows.Count > 0)
                {
                    for (int k = 0; k < DS3.Tables["table"].Rows.Count; k++)
                    {
                        
                        BottomSearch(DS3.Tables["table"].Rows[k]["AF_FamilyID"].ToString(),RelationPath);
                    }
                }
            }
            DS3.Dispose();
            da3.Dispose();

            if (CompareArrayList(bottomMembers, (lblUserToMemberID.Text.ToString())))
            {
                List<string> str1 = FindTargetMember(bottomMembers, lblUserToMemberID.Text.ToString());

                RelationPath.Add(str1);
                return;
            }
           
		}

解决方案

This is always going to be recursive.

What you probably meant to do is pass the depth variable to your method. Right now, in your method you do this:

int depth = 0;
if (++depth < 10) { /*...*/ }



So that if statement is always going to be true. What you should do is pass the depth parameter do your recursive method, as a ref parameter. Like this:

protected void BottomSearch(String AncestorFamilyID, ArrayList RelationPath, ref int depth)
{
  if (++depth < 10) {}
}



When depth is 10, it'll not enter the if statement, and no longer will call this method recursively.


这篇关于如何在c#中停止执行递归函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆