• python递归和二分法


    一.递归

      1.递归就是自己调用自己

    def fn(n):
      print(n)
       fn(n+1)
    fn(1)           #递归深度官方1000    一般都递归到998 

      2.树形结构的遍历

    import os
    
    
    def fn(lujing, n):
        lst = os.listdir(lujing)  # 打开文件夹,列出文件内所有文件名
        for i in lst:  # 一个一个拿到文件名字
            path = os.path.join(lujing, i)  # 还原文件路径
            if os.path.isdir(path):  # 判断是不是文件夹
                print("	" * n, i)
                fn(path, n + 1)  # 递归,再一次遍历文件夹内的文件
            else:
                print("	" * n, i)
    
    
    fn("f:/", 0)

      3.递归的入口(参数)   和    出口(return) 

        找准入口和出口

    二.二分法

      掐头去尾取中间

      查找效率非常的高

     1.普通的二分法 

    lst = [1,3,5,7,12,36,68,79]
    num = int(input("请输入你要查找的数:"))    
    left = 0
    right = len(lst) - 1           # 索引就是长度-1
    
    while left <= right:
        mid = (left + right) // 2     # 取中间的数的索引
        if lst[mid] > num:              #当num小于中间值的时候就把右边的截掉
            right = mid - 1           
        elif lst[mid] < num:       # 当num大于中间值的时候就把左边的截掉
            left = mid + 1
        else:
            print("找到了")
            break
    else:
        print("没找到")

    2.递归二分法

    def fn(n, lst, left, right):
        while left <= right:
            mid = (left + right) // 2
            if lst[mid] > n:
                right = mid - 1
                return fn(n,lst,left ,right) # 递归如果有返回值,所有调用的地方必须写return
            elif lst[mid] < n:
                left = mid + 1
                return fn(n,lst,left, right)
            else:
                print("找到了")
                return mid
    
        else:
            print("没有找到")
            return -1
    
    n = int(input("请输入你要查找的数:"))
    print(fn(n, lst,0, len(lst)-1))

    三.拓展:

    最快的查找法(在python中比较麻烦,其他语言快,思想可取)

    lst = [1,3,55,98,37,41,2,5,1,4]
    new_list = []
    for i in range(max(lst)+1):   #找到数据中的最大值并取到最大值个数+1的索引 因为有0
        new_list.append(i)
        new_list[i] = 0   # 意思是弄最大值+1个空格子
    
    for c in lst:
        new_list[c] = 1      # 把自身的值 放在对应索引的格子里
    
    n = int(input("请输入你要查找的数:"))
    
    if new_list[n] == 1:    #格子里有东西就是找到了
        print("找到了")
    else:
        print("没有找到")
    

      

  • 相关阅读:
    算术入门之加减乘除
    scanf的返回值
    Flutter 开发环境配置
    DbContextOptionsBuilder
    MarkDown 的简单用法
    C# 多线程安全集合类
    .NET Core 中使用 MemoryCache 缓存
    JWT
    什么是跨域?跨域解决方法
    .Net Core 中配置的高级用法
  • 原文地址:https://www.cnblogs.com/q767498226/p/10115290.html
Copyright © 2020-2023  润新知