def func(n):
if n == 1:
return 1
return func(n-1) + n*(n-1)
print func(5)
感到困惑。不知道究竟是什么。是O(n)
吗?
答案 0 :(得分:4)
计算n*(n-1)
是固定时间操作。函数的有趣部分是调用func(n-1)
,直到n
为1
。该函数将进行n
这样的调用,因此它的复杂性为O(n)
。
答案 1 :(得分:1)
如果我们假设算术运算是常数时间运算(并且它们确实是数字相对较小时),那么时间复杂度为O(n)
:
T(n) = T(n-1) + C = T(n-2) + C + C = ... = n * C = O(n)
但实践中的乘法复杂性取决于底层类型(我们讨论的是类型取决于值的Python)。这取决于N
为N
接近无穷大。因此,严格来说,复杂性等于:
T(n) = O(n * multComplexity(n))
此multComplexity(n)
取决于用于大数字乘法的特定算法。
答案 2 :(得分:0)
如其他答案中所述,出于实际目的,答案接近O(n)
。为了更精确的分析,如果你不想做乘法是恒定时间的近似值:
计算n*(n-1)
需要O(log n * log n)
(或O(log n)^1.58
,具体取决于Python使用的算法,具体取决于整数的大小。请参阅here - 请注意,我们需要使用log
,因为复杂性与位数有关。
添加这两个词需要O(log n)
,所以我们可以忽略它。
乘法完成O(n)
次,因此总计为O(n * log n * log n)
。 (有可能让这个更严格,但它肯定比O(n)
更大 - 见WolframAlpha plot)。
在实践中,除非log
变得非常大,否则n
条款确实无关紧要。