• 递归函数之二分查找


    一、递归

    首先引入一个例子

    def story():
        s = """
        从前有个山,山里有座庙,庙里老和尚讲故事,
        讲的什么呢?
        """
        print(s)
        story()
        
    story()
    老和尚讲故事

    在一个函数里再调用这个函数本身,其最大层数限制是997,最大层数限制是python默认的

    结束递归的标志是:return

    修改递归最大深度的手段(一般情况下还是别修改比较好)

    import sys
    sys.setrecursionlimit(1000000)
    n=0
    def f():
        global n
        n+=1
        print(n)
        f()
    f()
    修改递归最大深度

    递归解决的问题:

    #就是通过参数,来控制每一次调用缩小计算的规模

    #适合的场景

    #数据的规模在减小,但是解决问题的思路没有改变

     练习:

    1.猜年龄游戏

    #猜e的年龄
    #e比d大两岁
    #d比c大两岁
    #c比b大两岁
    #b比a大两岁 
    #a 40了
    
    # 1.a  age(1) = 40
    # 2.b  age(1) + 2
    # 3.c   age(2) + 2
    # 4.d  age(3) + 2
    # 5.e  age(4) + 2
    
    def age(n):
        if n == 1:
            return 40
        else:
            ret = age(n-1)
            return ret + 2
    age(5)
    猜年龄

    2.如果一个数可以整除2,就整除,不能整除(*3+1)

    def func(num):
        print(num)
        if num==1:
            return
        if num%2==0:
            num=num//2
        else:
            num=num*3+1
        func(num)
    func(5)
    不能整除2

    3.一个数除2到不能整除2为止

    def cal(num):
        if num % 2 == 0:
            num  = num // 2
            return cal(num)
        else:
            return num
    
    print(cal(8))
    整除2

    递归函数与三级菜单

    def threeLM(dic):
        while True:
            for k in dic:print(k)
            key = input('input>>').strip()
            if key == 'b' or key == 'q':return key
            elif key in dic.keys() and dic[key]:
                ret = threeLM(dic[key])
                if ret == 'q': return 'q'
            elif (not dic.get(key)) or (not dic[key]) :
                continue
    
    threeLM(menu)
    View Code

    二、二分查找算法

    如果有这样一个列表,让你从这个列表中找到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]

    二分查找算法

    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]

    你观察这个列表,这是不是一个从小到大排序的有序列表呀?

    如果这样,假如我要找的数比列表中间的数还大,是不是我直接在列表的后半边找就行了?

    这就是二分查找算法

    简单二分法

    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 func(l, aim,start = 0,end = len(l)-1 ):
        mid = (start+end)//2
        if not l[start:end+1]:
            return
        elif aim > l[mid]:
            return func(l,aim,mid+1,end)
        elif aim < l[mid]:
            return func(l,aim,start,mid-1)
        elif aim == l[mid]:
            print("bingo")
            return mid
    
    index = func(l,68)
    print(index)
    
    二分法查找升级版
    升级版
  • 相关阅读:
    Archlinux 下系统如何设置让 Wine 调用 ibus输入法
    ArchLinux下Ecplise软件报错
    ArchLinux下shadow服务报错
    【转载】maven入门1
    oracle_sql语句的大全
    pl/sql快速输入select等语句
    [转载]彻底卸载oracleXE数据库服务器
    [转载]struts1小项目
    [工作]双核系统struts-config.xml
    java request获取各种数据
  • 原文地址:https://www.cnblogs.com/moning/p/7265103.html
Copyright © 2020-2023  润新知