递归
递归的两个条件:
- 一个函数在函数本身调用了函数自己
- 设置了正确的返回条件
因为函数的每次调用的时候都需要进行压栈,弹栈,保存和恢复寄存器的栈的操作,所以递归是非常消耗时间和空间的
递归的应用,用于遍历文件系统 的所有的文件
import os count = 0#为了打印出来的东西好看而使用的 def gg(path,ceng): lst =os.listdir(path)#打开文件夹,并列出该文件夹中所有的文件名和目录----以列表的形式进行返回 # print(lst) for i in lst: File_path = os.path.join(path,i)#将文件的路径与文件名进行拼接,形成绝路径 if os.path.isdir(File_path):#通过判断文件的绝对路径确定该文件是否是文件夹,如果是Ture,则递归执行函数,一层层往下找,直到是文件为止 print('\t'*ceng,i,sep = '') gg(File_path,ceng+1) else: print(i)#如果判断不是目录的话,直接将该文件的名称进行打印 gg('E:/a',count) #
匿名函数:
是为了解决一些简单的函数的需求而设置的一句话的函数,函数的参数可以有多个,多个参数之间使用’,’进行分隔,
基本形式
lambda 参数:表达式(返回值)
eg: lambda x,y : x+y
:号前面的相当于函数的形式参数,
使用的方法
panzhenwei(变量) = lambda x,y:x+y
调用的格式与基本的函数相同
panzhenwei(11,22)
info = [{“name”:panzhenwei ,”age”:18},{“name”:chenweixian,“age”:19}]
列表中字典的排序
info.sort(key = lamba x:x[‘name’]) 以名字进行排序
二分查找
普通的方式实现
lst = [4, 56, 178, 253, 625, 1475, 2580, 3574, 15963] n = int(input("请输入一个数字n:")) # 56 left = 0 # 左边界 right = len(lst) - 1 # 末尾的索引 右边界 while left <= right: # 当左边界大于右边界结束循环 mid = (left + right) // 2 # 求中间的索引坐标 if n < lst[mid]: # 判断你的数字和中间数的大小比较 . right = mid - 1 # 右边界往左移动 elif n > lst[mid]: left = mid + 1 # 左边界往右移动 else: print("找到了") # 找到了目标数字 break else: # 当左比右大, 循环结束. 没有找到目标数 print("没找到"
通过递归的方式实现
lis = [2,3,4,6,90,55,4,433,22] def Search(lis,gg,Left,Right): if Left > Right: return False Mid = (Left+Right)//2 if gg < lis[Mid]: Right = Mid-1 return Search(lis,gg,Left,Right)# #当递归有返回值的时候. 需要写return. 否则有可能接收不到返回值 elif gg >lis[Mid]: Left = Mid+1 return Search(lis, gg, Left, Right) else: print('找到了') return True gg = int(input('请输入一个数字:')) Left = 0 Right = len(lis)-1 bb = Search(lis,gg,Left,Right) print(bb)