加平方数时的递归记忆功能

时间:2019-03-12 11:29:49

标签: c# recursion

我正在努力用C#构造一个动态化的递归函数

我想要的是找到n个数字的平方和。 我想记住的是一个平方的结果。 因此,在n个数字中,如果我有3个实例2,我想存储(2 * 2)= 4而不调用该函数 再次递归计算(2 * 2),只需返回4并将其相加即可。我的功能在下面。

在使用该函数进行播放时,一直发生的是mem.Add(arr [index],calc);给 我有个例外,说密钥已存在于内存集合中,或者它不会循环遍历所有密钥 数组中的值。这可能吗?如果可以,怎么办?

int total = 16;
Hashtable mem = new Hashtable();

int[] arr = new int[7];
arr[0] = 2;
arr[1] = 3;
arr[2] = 2;
arr[3] = 4;
arr[4] = 3;
arr[5] = 2;
arr[6] = 4;

public int doSum(int[] arr, Hashtable mem, int index)
{
    int sum = 0;

    if (index < 0)
        return 0;
    if (mem.ContainsKey(arr[index]))
        return (int)mem[arr[index]];
    else
        calc = doSum(arr, mem, index - 1) + (int)Math.Round(Math.Pow(arr[index], 2));

    mem.Add(arr[index], calc);

    return sum;
} 

1 个答案:

答案 0 :(得分:0)

得到异常的原因是,您总是将要平方的数字作为键添加到哈希表中-仅在找不到时才应将其保存。另外,您不更新总和,如果要更新,还可以将总和保存到日期,而不是平方值,所以您的函数也将是错误的-尝试如下操作:

public int doSum(int[] arr, Hashtable mem, int index)
{
  int sum = 0;

  if (index < 0)
    return 0;

   int sqVal;
   if (mem.ContainsKey(arr[index]))
     sqVal = (int)mem[arr[index]];
   else
   {
     sqVal = (int)Math.Round(Math.Pow(arr[index], 2));
     mem.Add(arr[index], sqVal);
   }

   sum = doSum(arr, mem, index - 1) + sqVal;
   return sum;
 }