你看看你递归代码的复杂度 是O(2^n) 而第二个的复杂度是O(n) 运行效率当然不同
COUNTER = 0
def fibn(n):
global COUNTER
COUNTER += 1
if n == 0:
return 1
elif n == 1:
return 1
else:
return fibn(n-1) + fibn(n-2)
statistics = []
for i in range(35):
COUNTER = 0
fibn(i + 1)
statistics.append(((i + 1), COUNTER))
print statistics[(1, 1), (2, 3), (3, 5), (4, 9), (5, 15), (6, 25), (7, 41), (8, 67), (9, 109), (10, 177), (11, 287), (12, 465), (13, 753), (14, 1219), (15, 1973), (16, 3193), (17, 5167), (18, 8361), (19, 13529), (20, 21891), (21, 35421), (22, 57313), (23, 92735), (24, 150049), (25, 242785), (26, 392835), (27, 635621), (28, 1028457), (29, 1664079), (30, 2692537), (31, 4356617), (32, 7049155), (33, 11405773), (34, 18454929), (35, 29860703)]
做了一个简单的proflie
import cProfile
import pstats
def fibn(n):
if n == 0:
return 1
elif n == 1:
return 1
else:
return fibn(n-1) + fibn(n-2)
print ' i, calls, time'
for i in range(50):
pr = cProfile.Profile()
pr.enable()
fibn(i)
pr.disable()
stats = pstats.Stats(pr)
stats.strip_dirs()
st = stats.stats[('test1.py', 3, 'fibn')]
print '%3d,%10d,%8f' % (i, st[1], st[3])i, calls, time
0, 1, 0.000000
1, 1, 0.000001
2, 3, 0.000003
3, 5, 0.000005
4, 9, 0.000008
5, 15, 0.000012
6, 25, 0.000020
7, 41, 0.000033
8, 67, 0.000165
9, 109, 0.000088
10, 177, 0.000141
11, 287, 0.000228
12, 465, 0.000450
13, 753, 0.000601
14, 1219, 0.001016
15, 1973, 0.003561
16, 3193, 0.002593
17, 5167, 0.004372
18, 8361, 0.007097
19, 13529, 0.011073
20, 21891, 0.018552
21, 35421, 0.032467
22, 57313, 0.051762
23, 92735, 0.095383
24, 150049, 0.133490
25, 242785, 0.212390
26, 392835, 0.352861
27, 635621, 0.578204
28, 1028457, 0.987839
29, 1664079, 1.506812
30, 2692537, 2.682802
31, 4356617, 3.998936
32, 7049155, 8.089419
33, 11405773, 13.058235
34, 18454929, 23.930004
35, 29860703, 36.503880
目测fibn(50)要算出来需要两周