从递归

时间:2017-08-25 17:40:23

标签: 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)
            {
                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;
    }

myDict基本上是一个字典,可以保存它的最大值以及该值的关键字。

我的问题是从递归返回时dict没有改变。我的意思是,如果我调试函数和调用堆栈中有一些调用此函数,我尝试检查那里的变量的值。 num根据调用的时间保存应该的值,但dict始终保持“最新”值。

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

我认为可能有一些概念性的想法,我不能正确理解。

1 个答案:

答案 0 :(得分:2)

如果myDict基本上是Dictionary,则始终通过引用传递gen方法。 这意味着只有myDict的一个实例,并且在递归方法dict的每次迭代中都引用了这个唯一的实例。 只需从gen返回,就会从堆栈中弹出对myDict的引用,但这不会改变其内容。  如果你想将dict返回到之前的状态,你必须自己实现回溯。