python--递归, 二分法
一 . 递归
自己调用自己, 递归的入口(参数) 和 出口(return), 树形结构的遍历.
def func(): print("我是递归") func() func() 树形结构的遍历 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)
二 . 二分法
掐头结尾取中间, 查找效率非常的高
二分法查找 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])
用递归方法查找(第二种)
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) print(ret)