函数递归
一、递归
# 递归调用是函数嵌套调用的一种特殊形式,函数在调用时,直接或间接调用了自身,就是递归调用 #直接调用本身 def f1(): print('from f1') f1() f1() #间接调用本身 def f1(): print('from f1') f2() def f2(): print('from f2') f1() f1()
二、递归深度
递归函数如果不受到外力的阻止会一直执行下去。但是我们之前已经说过关于函数调用的问题,每一次函数调用都会产生一个属于它自己的名称空间,如果一直调用下去,就会造成名称空间占用太多内存的问题,于是python为了杜绝此类现象,强制的将递归层数控制在了997
997是python为了我们程序的内存优化所设定的一个默认值,我们当然还可以通过一些手段去修改它:
import sys print(sys.setrecursionlimit(100000)
# 1. 案例一 获得第count个人的年龄 def get_age(count): if count == 1: return 20 age = get_age(count - 1) - 2 # age(n) = age(n-1) - 2 return age print(get_age(5)) # 12 # 2. 案例二 求n的阶乘 n! = n * (n - 1)! def jiecheng(n): if n == 1 or n == 0: return 1 ji = jiecheng(n - 1) * n return ji print(jiecheng(5)) # 120
四、二分法
查找 66
# 简易二分法 l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88] def func(l,aim): mid = (len(l)-1)//2 if l: if aim > l[mid]: func(l[mid+1:],aim) elif aim < l[mid]: func(l[:mid],aim) elif aim == l[mid]: print("bingo",mid) else: print('找不到') func(l,66) func(l,6)# 升级二分法 def search(num,l,start=None,end=None): start = start if start else 0 end = end if end is not None else len(l) - 1 mid = (end - start)//2 + start if start > end: return None elif l[mid] > num : return search(num,l,start,mid-1) elif l[mid] < num: return search(num,l,mid+1,end) elif l[mid] == num: return mid