考虑书中生成递归过程的阶乘函数的伪代码:
function factorial1(n) {
if (n == 1) {
return 1;
}
return n*factorial1(n-1);
}
我不知道如何测量步骤的数量。也就是说,我不知道“步骤”的定义,所以我使用了书中的语句来定义步骤:
因此,我们可以通过计算(n-1)!并将结果乘以n来计算n!。
我认为这就是他们所说的一步。举个具体的例子,如果我们跟踪(factorial 5),
- factorial(1) = 1 = 1步(基本情况 - 恒定时间) - factorial(2) = 2*factorial(1) = 2步 - factorial(3) = 3*factorial(2) = 3步 - factorial(4) = 4*factorial(3) = 4步 - factorial(5) = 5*factorial(4) = 5步
我认为这确实是线性的(步骤数与n成比例)。
另一方面,这里是另一个阶乘函数,我一直在看到它,它有稍微不同的基本情况。
function factorial2(n) {
if (n == 0) {
return 1;
}
return n*factorial2(n-1);
}
这段与第一个例子完全相同,只是添加了另一个计算步骤:
- factorial(0) = 1 = 1 步(基本情况 - 常数时间)
- factorial(1) = 1*factorial(0) = 2 步
- ...
现在我认为这仍然是O(N),但如果我说factorial2更像O(n+1)(其中1是基本情况),而不是factorial1,因为它正好是O(N)(包括基本情况),我的说法是否正确?