递归关系

时间:2009-09-04 15:23:55

标签: algorithm recurrence

为什么递归因子算法的递归关系呢?

T(n)=1 for n=0
T(n)=1+T(n-1) for n>0

为什么不是这个?

T(n)=1 for n=0
T(n)=n*T(n-1) for n>0

将n的值设为1,2,3,4 ......第二个递归关系成立(正则计算的阶乘)不是第一个。

9 个答案:

答案 0 :(得分:6)

看起来T(n)是递归因子算法的时间复杂度的递归关系,假设时间乘法是恒定的。也许你误读了你的来源?

答案 1 :(得分:6)

我们通常使用递归关系来查找算法的时间复杂度。


这里,函数T(n)实际上不是用于计算阶乘的值,而是告诉你阶乘算法的时间复杂度。


这意味着找到n的阶乘,它将比n-1的阶乘需要多1次操作 (即T(n)= T(n-1)+1)等等。


因此,递归因子算法的正确递归关系是 对于n = 0,T(n)= 1 对于n> 0,T(n)= 1 + T(n-1) 不是你后来提到的。


像河内塔的复发一样 对于n> 0,T(n)= 2T(n-1)+1;

答案 2 :(得分:5)

我认为你的信息不好。正如您所观察到的,您引用的第二个递归关系是正确的。第一个只生成自然数。

答案 3 :(得分:4)

这个问题很混乱......你的第一个公式不是阶乘。对于所有n,它只是T(n)= n + 1。因子n是前n个正整数的乘积:阶乘(1)= 1.阶乘(n)= n *阶乘(n-1)。你的第二个公式基本上是正确的。

答案 4 :(得分:3)

你在哪里找到第一个?这是完全错误的。

无论价值是多少,每次都会加1。

答案 5 :(得分:3)

他所说的不是因子递归,而是它的时间复杂性 假设这是这种重复的伪代码:

1. func factorial(n)
2.   if (n == 0)
3.      return 1
4.   return n * (factorial - 1)
  • 我假设不涉及尾部递归消除。

第2行和第3行花费一个固定的时间,c1和c2 4号线的成本也是恒定的。但是,它调用阶乘(n-1),这需要一些时间T(n-1)。此外,一旦使用T(n-1),可以忽略将阶乘(n-1)乘以n所需的时间。
整个函数的时间就是总和:T(n)= c1 + c2 + T(n-1) 用big-o表示法,将其减少到T(n)= 1 + T(n-1)。

正如Diam所指出的那样,这是一个平坦的递归,因此它的运行时间应该是O(n)。它的空间复杂性将是巨大的。

答案 6 :(得分:1)

T(n)= T(n-1)+ 1是n的阶乘的正确递归方程。 该等式为您提供了计算n阶乘的n NOT值的阶乘的时间。

答案 7 :(得分:1)

首先,您必须找到一个基本运算,在此示例中为乘法。乘法在每个递归中发生一次。所以 T(n)= T(n-1)+1 此+1是基本操作(此示例为单数形式) T(n-1)是下一个递归调用。

答案 8 :(得分:0)

TL; DR:您问题的答案实际上取决于您定义顺序。也就是说,问题中的序列 T n 表示阶乘函数还是计算阶乘函数的运行时成本 X


阶乘函数

n 的阶乘 f n 递归定义为:

f n = n•f n-1 对于 n> 0 f < sub> 0 = 1

如您所见,上面的方程实际上是一个递归关系,因为它是一个方程,它与初始项 (例如 f 0 = 1 ),递归定义了一个序列(即阶乘函数 f n )。


建模计算阶乘的运行时成本

现在,我们将找到一个模型来表示计算 n 阶乘的运行时成本。我们将 T n 称为计算 f n 的运行时间成本。

看一下阶乘函数 f n 的定义,其运行时成本 T n 将由计算 f n-1 的运行时成本组成(即,该成本为 T n-1 ),加上执行 n f n-1 的乘法运算的运行时间成本。乘法是在恒定时间内实现的。因此我们可以说 T n = T n-1 + 1

但是, T 0 的值是多少? T 0 表示计算 f 0 的运行时成本。由于 f 0 的值最初是根据定义已知的,因此计算 f 0 的运行时成本为实际上是恒定的。因此,我们可以说 T 0 = 1

最后,我们得到的是:

对于 n> 0 T <,

T n = T n-1 + 1 sub> 0 = 1

上面的等式也是递归关系。但是,它定义的(连同初始项)是一个序列,用于建模计算阶乘函数的运行时成本


X 考虑到您的递归关系中的序列如何调用(即 T n ),我认为很有可能代表后者,即计算阶乘函数的运行时成本