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("不存在") #这个数字在原列表中是不存在的