def bar(n):
if n==0:
return 0
else:
return n+bar(n-1)
def foo(n):
if n==0:
return 0
else:
return bar(n)+foo(n-1)
嗨,我刚刚了解了空间和时间的复杂性。任何人都可以向我确认我是否正确地说foo
的时间复杂度是O(n ** 2)并且foo
的空间复杂度是O(n)?不太确定时间复杂度为foo
调用bar
只调用一次,而foo
总是调用2个函数。
答案 0 :(得分:0)
您每次拨打foo
时都会说T
作为输入参数,您需要从bar
拨打1
到{ {1}}。这意味着您正在执行以下操作:
T - 1
因此,通话次数如下:
foo's input bar's inputs
1 1,
2 2, 1,
3 3, 2, 1
4 4, 3, 2, 1
...
n n, n-1, n-2, ...
这是一个递归方程式,您可以将1, 2 , 3 , 4 , ... t
1 ,(1+2) , (1+2+3) , (1+2+3+4) , ... (t+t-1+t-2+...+1)
的递归方程式代替bar
,只需找到大n
。
这意味着O
的复杂性为O(t 2 ),并且由于放置foo
bar
的复杂性为O(n)
在n
方程式中,您将获得O(n 2 )。
您还可以通过在foo
的{{1}}行之前添加print('*')
来检查呼叫次数,从而非常简单地检查:
return
正如你可以看到2,我们有3个电话3个,我们有6个电话,4个我们有10个电话。
答案 1 :(得分:0)
你是对的。这里的空间复杂度实际上是程序执行期间调用堆栈的最大深度,它是O(n)
。对于foo
的时间复杂度,您可以计算函数调用的数量:
NC(foo(n)) = NC(bar(n)) + NC(foo(n-1)) + 1
由于显而易见NC(bar(n)) = n + 1
,我们(忽略那些常数“+ 1”部分):
NC(foo(n)) = n + NC(foo(n-1)) = n + (n-1) + NC(foo(n-2)) =
= n + (n-1) + ... + 1 = n(n+1)/2 = O(n^2)