【问题标题】:Recursive memoized function when adding squared numbers添加平方数时的递归记忆函数
【发布时间】: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 声明

标签: c# recursion


【解决方案1】:

您遇到异常的原因是您总是将要平方的数字作为键添加到哈希表中 - 只有在找不到时才应保存。此外,如果您更新了总和,那么您也不会更新总和,而不是平方值,因此您的功能也会出错 - 尝试这样的事情:

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;
 }

【讨论】:

  • 是的,我现在明白了。这是有道理的。谢谢。
猜你喜欢
  • 2022-12-03
  • 2019-11-29
  • 2012-11-26
  • 2014-10-31
  • 2012-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多