函数f(L)的复杂性是什么("大O"符号),其中n是L的长度?我可以理解内部函数的运行时间是不变的。因此 O (n)?
此功能取自课程中的过去测试" CS Python简介"。
>>> import random
>>> l = [1,2,3]
>>> comprandom = random.choice(l)
>>> comprandom
1
>>> comprandom
1
>>> comprandom
1
>>> comprandom
1
>>> comprandom
1
>>> comprandom
1
>>> random.choice(l)
3
>>> comprandom
1
>>>
答案 0 :(得分:2)
首先,请注意基本情况,基本上是
if i == 0:
return len(L)
其中 L 是前一个实例的[L, L]
。
如果 L 最初是列表,元组,字符串,...那么[L, L]
将是长度为2的列表,因此len(L)
将 O (1)。
接下来,您是否有任何可以作为 L 传递的对象,[L, L]
除了对输入参数的一对引用之外还有什么?如果没有,那么每个实例只是一对 O (1)的调用。
要观察此操作,请在输入函数时添加一个简单的跟踪语句:
print("ENTER", i, L)
并观察每个函数调用的内容。
这足以让你得到答案吗?
答案 1 :(得分:2)
快速方法是检测功能并运行它:
def f(L):
print("Call f({})".format(repr(L)))
def f_helper(L,i):
print("{}call f_helper({}, {})".format(" "*(4 - i), repr(L), repr(i)))
if i:
res = f_helper([L, L], i-1) + f_helper([L, L], i-1)
print("{}return {}".format(" "*(4 - i), res))
return res
else:
res = len(L)
print("{}return {}".format(" "*(4 - i), res))
return res
return f_helper(L,3)
然后
>>> f("LLL")
Call f('LLL')
call f_helper('LLL', 3)
call f_helper(['LLL', 'LLL'], 2)
call f_helper([['LLL', 'LLL'], ['LLL', 'LLL']], 1)
call f_helper([[['LLL', 'LLL'], ['LLL', 'LLL']], [['LLL', 'LLL'], ['LLL', 'LLL']]], 0)
return 2
call f_helper([[['LLL', 'LLL'], ['LLL', 'LLL']], [['LLL', 'LLL'], ['LLL', 'LLL']]], 0)
return 2
return 4
call f_helper([['LLL', 'LLL'], ['LLL', 'LLL']], 1)
call f_helper([[['LLL', 'LLL'], ['LLL', 'LLL']], [['LLL', 'LLL'], ['LLL', 'LLL']]], 0)
return 2
call f_helper([[['LLL', 'LLL'], ['LLL', 'LLL']], [['LLL', 'LLL'], ['LLL', 'LLL']]], 0)
return 2
return 4
return 8
call f_helper(['LLL', 'LLL'], 2)
call f_helper([['LLL', 'LLL'], ['LLL', 'LLL']], 1)
call f_helper([[['LLL', 'LLL'], ['LLL', 'LLL']], [['LLL', 'LLL'], ['LLL', 'LLL']]], 0)
return 2
call f_helper([[['LLL', 'LLL'], ['LLL', 'LLL']], [['LLL', 'LLL'], ['LLL', 'LLL']]], 0)
return 2
return 4
call f_helper([['LLL', 'LLL'], ['LLL', 'LLL']], 1)
call f_helper([[['LLL', 'LLL'], ['LLL', 'LLL']], [['LLL', 'LLL'], ['LLL', 'LLL']]], 0)
return 2
call f_helper([[['LLL', 'LLL'], ['LLL', 'LLL']], [['LLL', 'LLL'], ['LLL', 'LLL']]], 0)
return 2
return 4
return 8
return 16
......应该立即明白L的原始内容对所发出的电话数量没有影响。