C# 从递归返回时,字典保持不变

C# 从递归返回时,字典保持不变,c#,dictionary,recursion,C#,Dictionary,Recursion,我有一段代码,它使用递归计算所有数字的总和 static long gen(int limit, List<int> primes,int num,int idx,myDict dict,long sum) { for (int i = idx; i < primes.Count; i++) { if (num * primes[i] > limit || num * primes[i] < 0)

我有一段代码,它使用递归计算所有数字的总和

static long gen(int limit, List<int> primes,int num,int idx,myDict dict,long sum)
    {

        for (int i = idx; i < primes.Count; i++)
        {
            if (num * primes[i] > limit || num * primes[i] < 0)
            {
                return 0;
            }
            dict.update(primes[i]);
            Console.WriteLine("{0}-->{1}", num * primes[i], dict.maxv);
            gen(limit, primes, num * primes[i], i, dict, sum + dict.maxv);
        }
        return sum;
    }
static long gen(int limit,List primes,int num,int idx,myDict dict,long sum)
{
for(int i=idx;i极限| | num*素数[i]<0)
{
返回0;
}
dict.update(primes[i]);
WriteLine(“{0}-->{1}”,num*primes[i],dict.maxv);
gen(极限,素数,num*primes[i],i,dict,sum+dict.maxv);
}
回报金额;
}
myDict基本上是一个保存最大值和该值的键的字典

我的问题是当从递归返回时,
dict
没有改变。我的意思是,例如,如果我调试这个函数,并且在调用堆栈中有一些对这个函数的调用,我尝试检查其中变量的值
num
保存调用它时应根据的值,但dict始终保存“最新”值

让我们举一个例子,在调用堆栈中,
num
的值当前为
8
,dict当前保存的值是:
2:(3,4)
我们应该拥有的dict是这样的。但是,如果我检查调用堆栈中以前的调用,我会发现在所有调用中,dict都具有相同的值,而不是它在函数可以从那里调用时所具有的值


我想可能有一些概念性的想法我没有正确理解

如果
myDict
本质上是一个
字典
,它总是通过引用
gen
方法传递。 这意味着只有一个
myDict
实例,并且在递归方法的每次迭代中
dict
都引用了这个实例。 只要从
gen
返回,就会从堆栈中弹出对您的
myDict
的引用,但这不会更改其内容。
如果您想将dict返回到其先前的状态,您必须自己实现回溯。

如果
myDict
本质上是一个
字典
,它总是通过引用
gen
方法传递。 这意味着只有一个
myDict
实例,并且在递归方法的每次迭代中
dict
都引用了这个实例。 只要从
gen
返回,就会从堆栈中弹出对您的
myDict
的引用,但这不会更改其内容。
如果要将dict返回到以前的状态,则必须自己实现回溯。

尝试定义通过引用传递dict的函数。哎呀。我认为约翰的答案是正确的。我认为这是相反的问题。试着定义通过引用传递dict的函数。哎呀。我认为约翰的答案是正确的。我想这是相反的问题。我不确定我是否完全理解你,你能举个简单的例子吗。如果我只是在写新的myDict(dict),我想它应该可以工作,但实际上不行。你能更好地解释一下这种回溯是什么吗?当你调用“gen”时,你实际上并没有传递字典(它的内容),而只是传递一个引用(它存储在内存中的地址)。如果在“gen”中更改了字典中的任何内容,然后从递归调用返回,那么这些更改仍然会发生(您正在从多个不同的位置查看同一个字典)。因此,如果您想使词典保持其以前的状态,则必须撤消所做的更改(即回溯):或者传递词典的实际副本。以下是使用普通词典的方法:
dictionary copy=新词典(原件)
(当然,在函数调用中不使用左侧)我不确定是否完全理解您的意思,您能给出一个简单的示例吗。如果我只是在写新的myDict(dict),我想它应该可以工作,但实际上不行。你能更好地解释一下这种回溯是什么吗?当你调用“gen”时,你实际上并没有传递字典(它的内容),而只是传递一个引用(它存储在内存中的地址)。如果在“gen”中更改了字典中的任何内容,然后从递归调用返回,那么这些更改仍然会发生(您正在从多个不同的位置查看同一个字典)。因此,如果您想使词典保持其以前的状态,则必须撤消所做的更改(即回溯):或者传递词典的实际副本。以下是使用普通词典的方法:
dictionary copy=新词典(原件)(当然,对于函数调用,请省略左侧)