我正在努力用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;
}
答案 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;
}