递归函数,二分查找,阶乘算法**

---恢复内容开始---

递归例子:

# 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)

猜你喜欢

转载自www.cnblogs.com/python884/p/9826412.html