确定递归函数的时间和空间复杂度

时间:2017-09-01 01:33:30

标签: python recursion time-complexity big-o space-complexity

def foo(n):
    def bar(n):
        if n == 0: 
            return 0
        else:
            return 1 + bar (n - 1)
    return n * bar(n)

如何根据输入n计算foo运行时间的时间复杂度?太空复杂性怎么样?

2 个答案:

答案 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)空间。

注意:通过尾递归实现可以进一步降低空间复杂度。

希望它有所帮助!