我将此作为测试问题来评估以下递归方法的时间复杂度。
def multiply(x,y)
if y = 0:
return 0
z = multiply(x,y/2)
if y is even:
return 2z
else :
return x + 2z
我写了log(n),因为数字y持续减少2,递归调用很快就会在满足条件时结束。
答案 0 :(得分:1)
如果函数意图在问题中进行零检查,则此函数将永远不会终止。
这是一个有效的python版本:
def multiply(x,y):
if y == 0:
return 0
z = multiply(x,y/2)
if y % 2 == 0:
return 2 * z
else :
return x + 2 * z
无论你输入什么:这将以递归错误结束。所以复杂性是无限的。也许这是一个棘手的问题。
但是,如果老师的意思是这样的话:
def multiply(x, y):
if 0.01 > y > -0.01:
return 0
z = multiply(x, y / 2)
if y % 2 == 0:
return 2 * z
else:
return x + 2 * z
然后复杂性看起来确实像log(n)
。
以下是一些复杂性基准测试代码,用于计算操作数:
counter = 0
def multiply(x, y):
global counter
counter += 1
if 0.01 > y > -0.01:
return 0
z = multiply(x, y / 2)
if y % 2 == 0:
return 2 * z
else:
return x + 2 * z
for i in range(1000):
counter = 0
multiply(1, i)
print(i, counter)
它打印一系列对数性的数字:
0 1
1 8
2 9
3 10
4 10
5 10
6 11
7 11
8 11
9 11
10 11
11 12
12 12
13 12
14 12
15 12
16 12
17 12
18 12
19 12
20 12
21 13
22 13
23 13
24 13
25 13
26 13
27 13
28 13
29 13
30 13
...