---恢复内容开始---
递归例子:
# a比b大两岁,b比c大两岁,c比e大两岁,e=20, 一定要有规律,而且循环不能太多的时候,用递归 def fun(n): if n == 4: return 20 elif n > 0 and n < 4: return fun(n + 1) + 2 print(fun(2))
思路:
a=1
b=2
c=3
e=4 =20
c比e大两岁,比如n=3,那么n就等于 (3+1)+2 (3+1)就是e,e+2=c。那么得出一个公式 (n+1)+2
第一次调用
def fun(2): if n == 4: return 20 elif n > 0 and n < 4: n=2那么是走这个判断 return fun(2 + 1) + 2 ------调用本身,先走()里面的,n=2 那么2+1=3 fun(3)调用完成返回24,那么就是22+2=24.然后返回
第二次调用
def fun(3): 这里n已经变为3了 if n == 4: return 20 elif n > 0 and n < 4: 还是走这个 return fun(n + 1) + 2 还是调用本身 先走()n=3 3+1=4 第三次调用结束调用,返回20 那么这里就是20+2=22,找到fun(3)调用的地方
第三次调用
def fun(4): 这里n变为4了 if n == 4: return 20 返回20---也就是fun(4)调用4的结束,返回到调用的地方 elif n > 0 and n < 4: return fun(n + 1) + 2
例子二: 有一个文件,里面有20多行,5行为一页,根据用户输入的页数,输出对应页数的行数 with open('file', encoding='utf-8') as f: ret = f.readlines() num = int(input('请输入页数:')) pag, wo = divmod(len(ret), 5) if wo: pag +=1 if num == pag and wo !=0: for i in range(wo): print( ret[(num-1)*5+i].strip()) elif num <pag: for i in range(5): print( ret[(num-1)*5+i].strip()) else: print('me')
二分查找法:需要注意的是,必须是要有序的,如果不是有序的,先要排序 第一版,简化版 l = [1, 2, 3, 4, 5, 6, 7, 8, 12, 13, 15, 17, 27, 7, 38] def fun(l, n): num = len(l) // 2 if l[num] > n: nun = l[num + 1:] fun(nun, n) elif l[num] < n: nun = l[: num] fun(nun,n) else: print('找到了', num, l[num]) fun(l, 8)
第二版本:有返回值,有判断
def fun(l, admin, sta=0, end=None): end = len(l) if end is None else end 因为长度是需要变的,但是列表的长度是固定的,所有,设置一个参数,当end为none的时候,end就是列表的长度,如果end有参数就等于自己 pa_ne = (end - sta) // 2 + sta 找到中间位置, if sta < end: 根据开始位置和结束位置来判断,如果开始位置,大于结束预支,就表示没有找到 if pa_ne < admin: return fun(l, admin, sta=pa_ne + 1, end=end) elif pa_ne > admin: return fun(l, admin, sta=sta, end=pa_ne - 1) else: return '找到了', pa_ne, l[pa_ne] else: return '没有这个数字' ret = fun(l,13) print(ret)