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=新词典(原件)代码>(当然,对于函数调用,请省略左侧)