【发布时间】:2019-08-02 20:42:40
【问题描述】:
我正在努力在 C# 中构建一个 momoized 递归函数
我想要的是找到 n 个数字的平方和。 我想记住的是一个已经找到的数字平方的结果。 所以在 n 个数字中,如果我有 3 个 2 的实例,我想存储 (2 * 2) = 4 而不是调用函数 再次递归计算 (2 * 2),只需返回 4 并将其相加即可。我的功能如下。
在玩弄这个函数时,不断发生的是 mem.Add(arr[index], calc);给 我有一个例外,说 key 已经存在于 mem 集合中,或者它没有循环遍历所有 数组中的值。这可能吗?如果可以,怎么办?
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;
}
【问题讨论】:
-
您是否有任何特殊原因要这样做 - 保存和搜索此类重复计算所花费的时间很可能比重复计算要长。
-
这是出于理论目的,而不是实际目的。我现在正在学习递归、动态编程和各种编程技术。
-
您提供的代码无法编译
-
很可能不会为您编译,因为函数声明之前的代码必须进入一个 main 函数,然后调用 doSum 函数。
-
@SmokerJones 代码中没有
calc声明