递归和二分法
1. 递归
自己调用自己
递归的重点是 入口(参数) 和 出口(return)
树形结构的遍历
遍历f盘里所有的文件和文件夹
import os def func(lujing,n): lis = os.listdir(lujing) for i in lis : a = os.path.join(lujing,i) if os.path.isdir(a) : print("..."* n + i) func(a,n+1) else : print("..."* n + i) func("f:/",0)
2. 二分法
掐头结尾取中间
查找效率非常的高 且必须是有序的
lis = [1,65,3,2,1,95,63,8942] lis1 = list(sorted(lis,key = lambda i:i)) n = int(input("请输入你要查询的数字:")) left = 0 right = len(lis)- 1 while left <= right : mid = (left+right)// 2 if n > lis1[mid] : left = mid + 1 elif n < lis1[mid] : right = mid - 1 else : print("存在的") break else : print("不存在")
##递归查找 递归时对列表进行切边 必须是有序的
lis = [1,65,3,2,1,95,63,8942]
lis = [1,65,3,2,1,95,63,8942] def func(x,lis1) : if lis1 != [] : left = 0 right = len(lis1)-1 mid = (left+right)//2 if x > lis1[mid] : del lis1[:mid+1] func(x,lis1) elif x < lis1[mid] : del lis1[mid:] func(x,lis1) else : print("存在") else : print("不存在") n = int(input("请输入你要查询的数字:")) lis2 = list(sorted(lis,key = lambda i:i)) func(n,lis2)
###递归查找 递归时,改变列表的索引,用二分法查找.必须是有序的
lis = [1,65,3,2,1,95,63,8942]
lis = [1,65,3,2,1,95,63,8942] def func(x,lst,left,right): if left <= right : mid = (left+right)//2 if x > lst[mid] : left = mid +1 func(x,lst,left,right) elif x < lst[mid] : right = mid - 1 func(x,lst,left,right) else : print("存在") else : print("不存在") n = int(input("请输入你要查询的数字:")) lis2 = list(sorted(lis,key = lambda i:i)) func(n,lis2,0,len(lis2)-1)
查找运算最快的方法 这个可以是无序的
lis = [1,65,3,2,1,95,63,8942] #先找出这个数列的最大值 lis1 = [] #创建一个空的列表 for i in range(8942+1): #对原列表的最大值进行range遍历 lis1.append(0) #每一次遍历都对新列表添加一个元素 for i in lis : #对原列表进行编列 lis1[i] = 1 #把新列表的第i项元素,修改一个值(把原列表的每个元素当成新列表的索引,赋予一个新值) n = int(input("请输入你要查询的数字:")) #输入要查询的数字 if lis1[n] == 1 : #把这个数字当成新列表的索引,看看这个索引对应的值是否为新赋予的值,如果是 print("存在") #那这个数字在原列表中是存在的 else : #这个数字当成的新列表的索引,这个索引所对应的值不是新赋予的值的话, print("不存在") #这个数字在原列表中是不存在的