函数中的递归 二分法查找法
递归:
函数自己调用自己
def func():
print("我是递归") #这里了变为死循环
func()
func() # 官方最大1000,你永远跑不到1000, 我实测998
while 1:
print("我不是递归")
树形结构的遍历
假设存在一个文件夹a,放在d盘里面,a里面有文件夹b,c b里面有文件夹d和e c里面有文件f
现在需要打印出所有的文件和文件名,这里的存在就是一个树形结构
import os
def func(lujing, n): # "d:/a/"
lst = os.listdir(lujing) # 打开文件夹. 列出该文件夹内的所有文件名
for el in lst: # el是文件的名字. b, c
# 还原文件路径
path = os.path.join(lujing, el) # "d:/a/b"
if os.path.isdir(path): # 判断路径是否是文件夹
print("..." * n,el) # 显示文件夹的名字
func(path, n + 1) # 在来一次 ################
else:
print("\t" * n,el) # 显示文件
func("d:/a", 0)
def func(lujing, n): # d:/a/b
lst = os.listdir(lujing)
for el in lst: # b, c
# 路径
path = os.path.join(lujing, el) # 拼接路径 d:/a/b
# 判断是文件还是文件夹
if os.path.isdir(path):
print("\t" * n, el)
func(path, n+1)
else:
f = open(path, mode="wb")
f.write(b'1')
print("\t" * n, el)
func("d:/a/", 0)
二分法查找
所谓二分法查找,每次能够排除掉一半的数据,查找的效率非常高,但是局限性非常大,前提必须是有序的序列才能使用二分法
lst = [1,3,5,7,12,36,68,79] # 数据集 百万级数据 只有数据足够多的时候,二分法效率足够高
num = int(input("请输入你要查找的元素信息:"))
for el in lst:
if num == el:
print("存在") #这里循环列表,当数据足够大的时候就不太适合了
break
else:
print("不存在")
len(lst)
0 1 2 3 4 5 6 7
[1,3,5,7,12,36,68,79]
n = 28 # 3
规则. 掐头结尾取中间, 必须是有序序列,
用二分法查找
二分法查找 (需要明白和掌握)
规则. 掐头结尾取中间, 必须是有序序列
lst = [1,3,5,7,12,36,68,79]
n = int(input("请输入一个数"))
left = 0
right = len(lst) - 1
while left <= right:
mid = (left + right)//2
if n > lst[mid]:
left = mid + 1
elif n < lst[mid]:
right = mid - 1
else:
print("存在")
break
else:
print("不存在")
递归 查找法
def func(n, lst):
left = 0
right = len(lst) - 1
if lst != []:
mid = (left + right)//2
if n > lst[mid]:
func(n, lst[mid+1:]) # 改变列表
elif n < lst[mid]:
func(n, lst[:mid])
else:
print("找到了")
return
else:
print("没找到")
return
n = int(input("请输入你要查找的数:"))
func(n, [1,3,5,7,12,36,68,79]) # 78
递归 方法二
递归二 (需要你明白和掌握)
def func(n, lst, left, right): # 递归找到什么是可以变的. 什么是不可以变的
if left <= right:
mid = (left + right) // 2
if n > lst[mid]:
left = mid + 1
return func(n, lst, left, right)
elif n < lst[mid]:
right = mid - 1
return func(n, lst, left, right) # 递归如果有返回值. 所有调用递归的地方必须写return
else:
print("找到了")
return mid # 难点
else:
print("找不到")
return -1
n = int(input("请输入你要查找的数:"))
lst = [1,3,55,98,37,41,2,5,1,4]
ret = func(n, lst, 0, len(lst)-1) # 78
print(ret)
最快的查找方法,因为只做了一次比对
# 最快的查找
lst = [1,3,55,98,37,41,2,5,1,4]
new_lst = []
for i in range(99):
new_lst.append(0)
for i in lst: # 1,3,55,98
new_lst[i] = 1
print(new_lst)
i = int(input('请输入你要找的数据'))
if new_lst[i] == 0: # 1次
print("不存在")
else:
print("存在")