Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在递归函数中传递相同的值?_C# - Fatal编程技术网

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

C# 在递归函数中传递相同的值?,c#,C#,我有一个带签名的递归函数 public static string Recurse(string pattern, ObjectDict dict) dict的值永远不会更改。让我有点困扰的是,我必须携带几十个对它的引用,并在每次再次调用该函数时传递它。有办法解决这个问题吗 我所说的“永不改变”,是指在第一次调用之后。引用非常轻量级,所以不用担心。 如果你真的需要避免它(我不认为你这样做),考虑这样的事情: class MyClass { private ObjectDict m_di

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

public static string Recurse(string pattern, ObjectDict dict)
dict
的值永远不会更改。让我有点困扰的是,我必须携带几十个对它的引用,并在每次再次调用该函数时传递它。有办法解决这个问题吗


我所说的“永不改变”,是指在第一次调用之后。

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

如果你真的需要避免它(我不认为你这样做),考虑这样的事情:

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";
    }
}

通过这样做,您不再传递对同一字典的引用,而是始终访问成员对象。但是,您现在已经失去了函数的
静态
特性。

好吧,如果可以的话,可以将
递归
作为
ObjectDict
上的一个实例方法。然后您可以在内部调用
Recurse(pattern)


如果出于任何原因,这是不可能的,不要担心。事实上,这两个选项非常相似——例如方法,实际上有一个不可见的“this”参数,它首先传递,然后再传递其余的参数。您正好把自己的放在了另一端:)

一个选项是使用lambda表达式来保存
递归
函数的实际逻辑。然后可以递归调用它,因为它是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);
}
公共静态字符串递归(字符串初始模式,ObjectDict dict){
Func-inner=null;
内部=模式=>{
//使用内部调用进行递归的逻辑。可以访问dict
//因为它是lambda。例如
if(dict.SomeOperation()){
返回内部(其他模式);
}
返回值;
};
返回内部(初始模式);
}

ObjectDict
只是
字典
,因为我懒得到处键入:)哈哈。。。最近出现了一个问题,关于lambda在什么时候有用,我认为它们永远不会有用,除非用作函数的参数……当然向我展示了:p可能会这样做。谢谢:D