python之路 ---递归函数及二分法

递归:在函数调用的过程中,直接或者间接的调用了函数本身

分为两个阶段:1.回溯(一次次的调用下去,必须要有某个值来结束,否则一直调用下去)  2.递推

def f():
    print('你好')
    f()
f()

#这样的递归是没有意义的死循环
#而且,在第一次调用f()执行到f()后,又调用自己(但是第一次的f()并未结束),这样执行f()所申请的内存
#空间会越来越多,python则限制了这种情况的发生,抛出异常:
--->RecursionError: maximum recursion depth exceeded while calling a Python object

递归要注意的点:

      1.递归一定要有一个明确的结束条件

      2.问题的规模应该随着递归的次数减小

      3.python没有尾递归优化机制

 二分法:算法的一种,用于高效率解决一个问题

 例如有一个列表:

L = [1,5,3,7,8,11,77,88,99,33,45,98],输入一个数判断是否存在于这个列表之中(除去in等,单纯的用循环实现):

 L = [1,5,3,7,8,11,77,88,99,33,45,98]
number = int(input('输入一个数字:'))
Tage = True
while Tage:
    for i in L:
        if i == number:
            print(i)
            Tage = False
            break
    else:
        print('不存在!')
        break
#如果列表很大,而且被查找元素在很后面,那么就需要遍历几乎整个列表

使用二分法实现:

L = [1,5,3,7,8,11,77,88,99,33,45,98]
L.sort()
number = int(input('输入要查找的数字:'))
count=0
def func(l,count):
    if len(l) == 0:
        print('没有找到!')
        return
    half = len(l)//2
    if number == l[half]:
        print('找到数字:%s,查找了%d次'%(number,count))
    elif number > l[half]:
        func(l[half+1:],count+1)
    else:
        func(l[:half],count+1)
func(L,count)

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值