【问题标题】:Converting a recursive function to an iterative function which represents the output of my algorithm将递归函数转换为代表算法输出的迭代函数
【发布时间】:2013-10-21 22:16:37
【问题描述】:

编辑:我不是在寻找一种算法,而是一个类似于 f(i) = sum i=0 to n-1 (C * A[i]) 的数学方程,但是关于 n(数组的长度)而不是 i(迭代 #)。

我有一个算法,它遍历大小为 n 的数组 A(元素 A[0] 到 A[n-1]),并使用数组的元素进行一些计算。我设法为算法的输出值提取了以下递归函数 f(i),其中 i 是循环的迭代:

  • f(0) = A[n-1]
  • f(i) = C * f(i-1) + A[n-1-i]

...其中 C 是一个整数常量。

知道我们循环遍历整个数组后,我们进行 n-1 次迭代(我们在循环之前处理 f(0))。我想将此递归函数表示为直接迭代函数,例如f(i) = sum i=0 to n-1 (C * A[i]),但我不知道怎么做(如果可行的话,它肯定不像我的例子那么简单)。我真的不知道做这种事情的正式方法,我通常通过直觉来解决更简单的问题。

可行吗?如果是这样,怎么做? 希望我已经足够清楚了,谢谢。

【问题讨论】:

  • 如果它有效,为什么要改变它?
  • @AshBurlaczenko 我猜迭代函数可能比递归函数更有效。
  • 你的A是什么?是 1..n 吗?还是有明显增长速度的?
  • @SaeedAmiri A 是一个包含从索引 0 到 n-1 的 n 个元素的数组。每个元素的值未知,但它们是整数。
  • 如果每个元素A[i] 是任意的,你为什么期望你能找到这个算法关于n 的封闭式公式?该公式将取决于数组中的每个元素,而不仅仅是数组的长度。可能你正在尝试做加权移动平均线?有一个类似这样的高效解决方案:daycounter.com/LabBook/Moving-Average.phtml

标签: arrays algorithm math recursion


【解决方案1】:

我会说你描述的功能很简单

f(n) = sum (0 <= i < n: C^i * A[i])

你可以计算出的

int c = 1;
int sum = 0;
for (int i = 0; i < n; i++) {
    sum += c * A[i];
    c *= C;
}

【讨论】:

  • 哇,就是这样!谢谢!!
【解决方案2】:
result=A[n-1];
for(count=1;count<n;count++)
{
    result=result*C+A[n-1-count];
}
return result;

【讨论】:

    【解决方案3】:

    这里有一个 Java 解决方案:

    public static int[] f(int[] A) {
      int n = A.length();
      int[] result = int[n];
      result[0] = A[n-1];
      for (int i = 1; i < n; i++) {
        result[i] = result[i-1] + A[n-1-i];
      }
      return result;
    }
    

    只需使用一个新数组,从你原来的递归算法的翻译几乎是直接的。

    【讨论】:

      猜你喜欢
      • 2020-08-08
      • 2015-05-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多