• python递归函数及二分法查找


    函数的递归: 在一个函数的内部调用自己

    死循环: 可以无限循环,不会停止
    while True:
        print('我不是递归')
     
    递归: 不是死循环,有最大循环深度
    def story():
        print('我是递归')
        story()
    story()
    超过了递归的最大深度报错
    RecursionError: maximum recursion depth exceeded while calling a Python object

    官网上 源码中设置的递归深度: 1000
    自己实际测试递归深度: 998

    n = 0
    def func():
        global n
        n += 1
        print(n)
        func()
    func()
    import sys
    print(sys.getrecursionlimit())    #查看递归的最大深度
    
    如果你的递归每次都要超过限制 不适合用递归来解决
    为什么要有限制? 内存消耗的保护机制
    设置递归的最大深度
    import sys
    sys.setrecursionlimit(1000000)
    
    n = 0
    def func():
        global n
        n += 1
        print(n)
        func()
    func()

    总结
    1.递归函数的定义 :一个函数在执行的过程中调用了自己
    2.递归在python中的最大深度 : 1000/998
    3.递归的最大深度是可以自己修改的,但是不建议你修改

    案例(遍历树形结构)
    import os
    def func(lujing,n):
        lst = os.listdir(lujing)    #打开文件夹,列出该文件夹中的所有文件及目录
        for i in lst:               #循环文件夹中的所有名字,i相当于文件名
            path = os.path.join(lujing,i)   #拼接循环的文件名路径
            # print(path)
            if os.path.isdir(path): #判断拼接后的路径是否是目录
                print('	'*n,i)       #如果是目录就打印,n等于几就是几个tab键分隔
                func(path,n+1)          #然后再次调用自己,在重复上面的操作,
            else:
                print('	'*n,i)       #如果不是目录,就打印文件名
    func('E:/test/',0)  #0为分层间隔

    二分法查找主要的作用就是查找元素
    数据规则: 掐头结尾取中间,必须是有序序列,数据量越大,效率约明显(百万级数据集)

    lst = [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]
    print(len(lst))
    n = int(input('<<<<:'))
    start = 0
    end = len(lst) -1
    count = 0
    while start <= end:
        mid = (start + end) // 2
        count+= 1
        if n > lst[mid]:
            start = mid +1
        elif n < lst[mid]:
            end = mid -1
        else:
            print('存在')
            break
    else:
        print('不存在')
    print('查找了%s次'%count)
    
    方法2
    lst = [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(n,lst):
        start = 0
        end = len(lst) -1
        # count = 0
        if lst != []:
            mid = (start + end) //2
            if n > lst[mid]:
                func(n,lst[mid+1:])
            elif n < lst[mid]:
                func(n,lst[:mid])
            else:
                print('存在')
                return
        else:
            print('不存在')
            return
    n = int(input('<<<:'))
    func(n,lst)
    
    方法3
    lst = [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(n,lst,start,end):
        if start <= end:
            mid = (start + end) //2
            if n > lst[mid]:
                start = mid + 1
                return func(n,lst,start,end)
            elif n < lst[mid]:
                end = mid - 1
                return func(n,lst,start,end)
            else:
                print('找到了')
                return mid
        else:
            print('找不到')
            return -1
    n = int(input('<<:'))
    ret = func(n,lst,0,len(lst)-1)
    print(ret)
    
    #最快的查找
    lst = [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]
    new_lst = []
    for i in range(88):
        new_lst.append(0)
    for i in lst:
        new_lst[i] = 1
    print(new_lst)
    i = int(input('<<<:'))
    if new_lst[i] == 0:
        print('存在')
    else:
        print('不存在')
  • 相关阅读:
    谷歌云服务器XShell登录
    PGI 遇到的坑
    Matlab处理数据导出Paraview可读的vtk文件(二)
    Matlab处理数据导出Paraview可读的vtk文件(一)
    Windows7 + OSG3.6 + VS2017 + Qt5.11
    CentOS安装指定版本GCC
    利用ncurses库开发终端工具箱(1)—— ToDoList小工具开发
    Winform Post请求传递Json格式参数的写法
    把Java代码转成c#可用的dll
    Image.FromStream(ms) 提示参数无效
  • 原文地址:https://www.cnblogs.com/wangm-0824/p/10199565.html
Copyright © 2020-2023  润新知