如何退出具有返回类型的C#递归方法

时间:2011-05-12 05:21:59

标签: c# recursion

我的代码如下所示,

public object GetObjectValue(object obj, int condition)
{
     if(condition > 10)
     {
       //exit from method 
       // return; gives compiler error.      
     }
     else
     {
        GetObjectValue(obj,condition); // like this i need to use recursive call.
        //Do stuffs
     }
}

如何退出此方法。帮助我。

4 个答案:

答案 0 :(得分:8)

有些观点:

  1. 在任何一种情况下你都需要返回一些东西。即使您在return nullif(condition > 10),您的下一个编译错误也会说您需要在每个路径上返回一个值(实际上,这是相同的编译错误)
  2. GetObjectValue(obj,condition);可能会导致无限递归 - 您一遍又一遍地使用相同的值来调用它。
  3. 你不能在return语句之后“做东西” - 这标志着已执行代码的结束(除非你有finally块,但这是另一个主题)。如果您不希望return该值也很好,但您可能想以某种方式使用它:object returnedValue = GetObjectValue(obj, condition);
  4. 你可能正在寻找类似的东西:

    public object GetObjectValue(object obj, int condition)
    {
         if(condition > 10)
         {
           //exit from method 
           return null; 
         }
         else
         {
            IChild current = (IChild)obj
            //Do stuffs HERE
            return GetObjectValue(current.Parent, condition + 1);  recursive call.
         }
    }
    

答案 1 :(得分:4)

您需要返回一个对象引用,或者为null。

public object GetObjectValue(object obj, int condition) {
    if (condition > 10) {
        return null;
    } else {
        return GetObjectValue(obj, condition);
    }
}

请注意,此方法很容易出现堆栈溢出错误,因为condition小于或等于10的任何值都不会到达基本情况终止条件。递归方法需要一个在不调用自身的情况下返回值的情况。

public object GetObjectValue(object obj, int condition) {
    if (condition > 10) {
        return null;
    } else {
        return GetObjectValue(obj, condition++);
    }
}

现在condition递增,所以当调用该方法时,它最终会向大于10的值前进,满足条件并返回null。这仍然是一种无用的方法,因为它只能为任何输入返回相同的值;唯一的区别是它在返回null之前进行了多少次递归调用。

答案 2 :(得分:1)

您应该返回一个对象:

public object GetObjectValue(object obj, int condition)

更改返回类型:

public void GetObjectValue(object obj, int condition)

或使用有效的退货声明:

if(condition > 10)
 {
   //exit from method 
   return null;
 }

答案 3 :(得分:1)

您已将返回类型指定为对象,因此必须指定有效的返回类型。尝试以下代码更改,

public object GetObjectValue(object obj, int condition)
{
    if (condition <= 10)
    {
        GetObjectValue(obj, condition);
    }
    return null;   //return whatever object you have to return
}