在递归函数中传递相同的值?

时间:2010-11-24 22:13:59

标签: c#

我有一个带签名的递归函数

public static string Recurse(string pattern, ObjectDict dict)

dict的值永远不会改变。让我感到困扰的是,我应该随身携带几十个引用,并在每次再次调用函数时传递它。有办法解决这个问题吗?

“永不改变”,我的意思是在最初的电话之后。

3 个答案:

答案 0 :(得分:10)

引用非常轻量级,所以不用担心。

如果你真的需要避免(而且,我认为你不这样做),请考虑以下事项:

class MyClass
{
    private ObjectDict m_dict;

    public string Recurse(string pattern, ObjectDict dict)
    {
        m_dict = dict;
        return HelperRecurse(pattern);
    }

    private string HelperRecurse(string pattern) 
    {
        // do some work. (referring to m_dict)
        HelperRecurse(pattern);  // Go recursive

        return "Hello World";
    }
}

通过执行此操作,您不再传递对同一字典的引用,只是始终访问成员对象。但是,您现在已经失去了static功能的性质。

答案 1 :(得分:2)

一种选择是使用lambda表达式来保存Recurse函数的实际逻辑。然后可以递归调用它,因为它是一个lambda,它可以访问dict对象,而不必传递它

public static string Recurse(string initialPattern, ObjectDict dict) {
  Func<string, string> inner = null;
  inner = pattern => {
    // Logic which uses calls to inner for recursion.  Has access to dict
    // because it's a lambda.  For example
    if (dict.SomeOperation()) { 
      return inner(someOtherPattern);
    }
    return aValue;
  };
  return inner(initialPattern);
}

答案 2 :(得分:1)

嗯,显而易见的替代方法是,如果可以的话,在Recurse上设置ObjectDict实例方法。然后,您可以在内部致电Recurse(pattern)

如果 实际上,这两个选项实际上非常相似 - 例如方法,实际上是一个不可见的“this”参数,它首先在其余参数之前传递。你碰巧把你的东西放在另一端:)