递归:一种直接直接或者间接调用自身算法的过程
递归在调用的过程中,是在上一层循环还没有结束直接进入下一层,多层嵌套调用实现调用
例1:
1 def func(n): 2 print(n) 3 if n > 1: 4 t = func(n / 2) 5 print('T', t) # 当循环结束,会一层一层退出循环,退出一层打印一层 6 else: 7 print('已经是最小了') 8 print('N', n) 9 return n # 返回n 用于观察 T 退出循环 10 func(100)
结果:
100 50.0 25.0 12.5 6.25 3.125 1.5625 0.78125 已经是最小了 N 0.78125 T 0.78125 N 1.5625 T 1.5625 N 3.125 T 3.125 N 6.25 T 6.25 N 12.5 T 12.5 N 25.0 T 25.0 N 50.0 T 50.0 N 100
例2:裴波那契数列:(用递归实现)(0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987)
1 def num(x, y, stop): 2 if x+y < stop: # 递归数列结束值,如果没有条件限制会直接报错 3 # 因为过度的递归会造成栈溢出 4 z = x + y 5 print(z) 6 num(y, z, stop) 7 num(0, 1, 1000)
结果:
1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
二分算法:
1 def binary(binary_para, search): 2 bi = int(len(binary_para)/2) # 分为两部分 bi 为下标 3 if search == binary_para[0]: # 判断传入数是否为第一个 4 print('列表里存在,并且这是列表第一个数: %s' % search) 5 elif len(binary_para) > 1: # 利用递归不断二分 6 if binary_para[bi] > search: 7 print('分段值(前):', binary_para[bi]) # 打印分段的值 8 binary(binary_para[:bi], search) 9 elif binary_para[bi] < search: 10 print('分段值(后):', binary_para[bi]) 11 binary(binary_para[bi:], search) 12 else: 13 print('你找到了,列表里有这个数!!') 14 15 else: 16 print('这个列表里 没有 这个数!!') 17 18 19 if __name__ == '__main__': # 在自己.py文件里,可以运行,其他文件访问不运行此方法 20 size = list(range(4, 300000, 10)) # 区间(4,300000)间断10个数的列表 21 # binary(size, 1) 22 binary(size, 12138)
结果:
分段值(前): 150004 分段值(前): 75004 分段值(前): 37504 分段值(前): 18754 分段值(后): 9374 分段值(前): 14064 分段值(后): 11714 分段值(前): 12884 分段值(前): 12294 分段值(后): 12004 分段值(前): 12144 分段值(后): 12074 分段值(后): 12104 分段值(后): 12124 分段值(后): 12134 这个列表里 没有 这个数!!