algorithm - 开发算法的递归关系

标签 algorithm recurrence

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

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]

最佳答案

您非常接近正确的重复,但您所拥有的有点不对劲。

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

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

那么让我们看看这个函数做了什么。由于 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 循环内而不是在循环外。

关于algorithm - 开发算法的递归关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46894504/

相关文章:

big-o - 循环 T(n)= 2T(n/2) + (n-1)

icalendar - iCalendar 中的 RECURRENCE-ID (RFC 5545)

algorithm - 查找所提供序列的第 N 项

独立图集的算法?

c++ - 为什么字符串中的最后一个符号在 'std::remove' 之后加倍?

c - 反转列表而不复制(递归方法)

algorithm - Master Theorem混淆与三种情况

java - treeMap中entrySet的时间复杂度是多少

algorithm - 连通图中的 K-Clique

algorithm - 求解递归 T(n) = T(sqrt(n))+a