系列文章目录
一、递归函数
-
概念:
函数的递归调用是指在函数的执行过程中,直接或间接的调用函数自身。它的效果类似于循环。
-
格式:
def foo(): print('嘤嘤嘤') foo() # 自己调用自己 foo() # 会一直嘤嘤嘤
-
递归出口:
递归出口,类似于循环的结束标志,就是递归函数结束的标志,比如:某个整数值变为0时,就结束函数的递归调用。
如果没有递归出口(比如上面的foo),则会陷入死循环,且会消耗完所有的内存空间。
-
举例:
打印嵌套列表中的所有元素,不打印列表:
l = [1, 2,[3, 4, [5], 6], 7] def foo(l): for i in l: if type(i) is list: foo(i) # 如果元素是列表类型,就调用自身继续判断 else: print(i) foo(l) """ 打印: 1 2 3 4 5 6 7 """
二、二分法查找
-
二分法查找是一种查找特定元素的算法:
-
先找到有序序列的中间元素。
-
判断该元素是否为要查找的目标元素。
-
如果是,表示找到目标元素,结束查找。
如果不是,就判断中间元素与目标元素的大小。
-
如果,中间元素>目标元素:就从中间元素的左边(小于中间元素的部分)开始找起,从第1步开始。
如果,中间元素<目标元素:就从中间元素的右边(大于中间元素的部分)开始找起,从第1步开始。
-
-
举例:
从有序列表中找出指定元素,使用递归的方法:
l = [0, 3, 4, 5, 9, 17, 45, 67, 69, 76, 88, 91, 100, 111] def binary_search(l, target): if len(l) == 0: print('没找到!') return mid_index = len(l) // 2 # 中间元素的索引 if l[mid_index] < target: l = l[mid_index+1:] binary_search(l, target) # 递归调用,继续查找 elif l[mid_index] > target: l = l[:mid_index] binary_search(l, target) # 递归调用,继续查找 else: print('找到了!') binary_search(l, 8) # 打印:没找到! binary_search(l, 88) # 打印:找到了!