def foo(n):
def bar(n):
if n == 0:
return 0
else:
return 1 + bar (n - 1)
return n * bar(n)
如何根据输入n计算foo运行时间的时间复杂度?太空复杂性怎么样?
答案 0 :(得分:1)
让我们分解一下:
return n * bar(n)
→ n * (1 + bar(n - 1))
→ n * (1 + 1 + bar(n - 2))
→ n * (1 + 1 + 1 + bar(n - 3))
→ n * (1 + 1 + 1 + .... <n times> + bar(0))
→ n * n
这在时间和记忆中看似线性 - O(n)
。
答案 1 :(得分:0)
如cᴏʟᴅsᴘᴇᴇᴅ所述,运行时和空间都是 O(n)。
让我试着用递归关系和推导来解释它。
适用于运行时
Base case: T(0) = 1
Recurion : T(n) = T(n-1) + 1 (constant time for addition operation)
T(n) = T(n-1) + 1
= T(n-2) + 1 + 1
= T(n-3) + 1 + 1 + 1
= T(n-4) + 1 + 1 + 1 + 1
= T(n-4) + 4*1
...
= T(n-n) + n * 1
= T(0) + n * 1
= 1 + n
= O(n)
空间复杂度
将为所有递归调用创建'n'堆栈。 因此,O(n)空间。
注意:通过尾递归实现可以进一步降低空间复杂度。
希望它有所帮助!