【python之路23】递归及二分法查找
1、递归的基础
举例说明:老师要班里坐在最后的一排学生要一本书,老师对前面的人说你向最后一排的同学要一本书,那么最前面的人跟坐在第2排的人说,第2排的人跟第3排的人说,当命令传递到最后一排时,最后一排的同学给倒数第2排的人,倒数第2排的人,给倒数第3排的人,直到传递给第1排,第1排的同学把书给老师。
2、递归斐波那契数列
#!usr/bin/env python # -*- coding:utf-8 -*- #递归 斐波那契数列 def fab(n1,n2): if n1 > 10000: return print(n1) temp = n1 + n2 fab(n2,temp) fab(0,1)
3、递归过程返回值分析
#!usr/bin/env python # -*- coding:utf-8 -*- def f4(n): if n == 5: return 200 r = f4(n+1) return r print(f4(1))
执行过程如下图:
4、递归求斐波那契数列的第10个值
#!usr/bin/env python # -*- coding:utf-8 -*- def fab(n,a1,a2): if n == 10: return a1 a3 = a1 + a2 r = fab(n+1,a2,a3) return r re = fab(1,0,1) print(re)
5、利用递归读取目录下的所有文件夹和文件
#通过递归将目录下所有的文件及文件夹进行打印
import os
mypath = 'D:\\project\\untitled1'
def func(my_path,n):
dirlist = os.listdir(my_path) #读取目录列表
for el in dirlist:
el_path = os.path.join(my_path,el) #连接目录和文件
if os.path.isdir(el_path): #判断是否为目录
print('\t' * n, el)
func(el_path,n+1)
else:
print('\t'*n,el)
func(mypath,0)
6、二分法查找
1)二分法查找的条件是:序列有序排序
li = list(range(10000000))
print("开始查找.........")
num = 50000
left = 0
right = len(li)-1
count = 0 #记录找了多少次
while left <= right:
count = count + 1
middle = (left + right) // 2
if num > li[middle]:
left = middle + 1
elif num < li[middle]:
right = middle - 1
else:
print(middle)
break
else:
print("没有找到这个数")
print('一共找了%s次' % count)
2)递归的方式实现二分查找
lis = [11, 22, 33, 44, 55, 66, 77, 88, 99]
def func(left, right, num, li):
middle = (left + right) // 2
if num > li[middle]:
left = middle + 1
elif num < li[middle]:
right = middle - 1
else:
return middle
re = func(left, right, num, li)
return re
result = func(0, len(lis) - 1, 88, lis)
print(result)