为什么递归因子算法的递归关系呢?
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 ......第二个递归关系成立(正则计算的阶乘)不是第一个。
答案 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) 不是你后来提到的。
答案 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 ),我认为很有可能代表后者,即计算阶乘函数的运行时成本。