Python 确定递归函数的时间和空间复杂度
如何根据foo的输入n计算foo运行时间的时间复杂度?那么空间复杂性呢?让我们将其细分:Python 确定递归函数的时间和空间复杂度,python,recursion,time-complexity,big-o,space-complexity,Python,Recursion,Time Complexity,Big O,Space Complexity,如何根据foo的输入n计算foo运行时间的时间复杂度?那么空间复杂性呢?让我们将其细分: def foo(n): def bar(n): if n == 0: return 0 else: return 1 + bar (n - 1) return n * bar(n) 这在时间和内存上呈线性-打开。如c所述ᴏʟᴅsᴘᴇᴇᴅ, 它在运行时和空间中都处于启用状态 让我试着用递推关系和推导来解释它 运
def foo(n):
def bar(n):
if n == 0:
return 0
else:
return 1 + bar (n - 1)
return n * bar(n)
这在时间和内存上呈线性-打开。如c所述ᴏʟᴅsᴘᴇᴇᴅ, 它在运行时和空间中都处于启用状态 让我试着用递推关系和推导来解释它 运行时 空间复杂性 将为所有递归调用创建“n”堆栈。 因此,在空间上 注意:通过尾部递归实现,可以进一步降低空间复杂度
希望有帮助 请修复您的缩进。@ChristianDean尝试过吗?:OP:它在堆栈中递归了多少次?这应该给你一个关于空间和时间复杂性的线索。@AChampion-Hmm,为什么这对我不起作用:| OP在我之前做了一次编辑。刚刚选中-将其回滚,在我编辑它时,它已正确缩进,但未编码。为什么它与bar不同,步骤数为n+1,而foo为nn+1,所以时间:^2?@kiki错了。乘法是一个常数运算。n*n是一个单独的步骤。然而,计算棒的输出是线性的。
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
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)