【问题标题】:Developing recurrence relation for algorithm开发算法的递归关系
【发布时间】:2017-10-23 16:46:55
【问题描述】:

我在为算法开发递归关系时遇到了困难。这是我给出的算法:

int result = silly (n);
public static int silly (int n)
{
if (n <= 1)
  {
   return -100;
  }
int sum = 0;
for (int i = 0; i < n; i++)
  {
  sum += i;
  }
return sum + silly (n-2);
} 

我了解基本情况是 T(1) = 1,但不明白 T(n) 是什么。会不会

T(n) = n[T(n-2) + 1]

【问题讨论】:

    标签: algorithm recurrence


    【解决方案1】:

    您已经非常接近正确的复发,但您所拥有的有点偏离。

    通常来说,递归关系将完成的工作分为两部分:

    • 单个递归调用中完成的工作,并且
    • 由于新的递归调用触发而完成的工作。

    那么让我们看看这个函数是做什么的。由于大的 for 循环,您在一次调用中完成的工作是 O(n) 是正确的。所以这意味着我们会有类似的东西

    T(n) = ________ + O(n)

    您在空白处填写的位对应于单个函数触发的递归调用。在这种情况下,每个函数调用都会触发一个额外的递归调用,其输入的大小为 n - 2,因此递归将是

    T(n) = T(n - 2) + O(n)

    你想出的答案本质上是

    T(n) = nT(n - 2) + O(n)

    这很接近,但高估了最终进行的递归调用的数量。写 nT(n - 2) 作为递归的一部分意味着有 n 个不同的递归调用来自单个调用,每个调用的大小为 n - 2。这就是你会得到的,如果,比如说,递归调用是在 for 循环内部而不是在它外部。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-28
      • 1970-01-01
      • 2020-11-09
      • 1970-01-01
      • 2016-01-20
      • 1970-01-01
      • 2014-04-29
      相关资源
      最近更新 更多