python递归和二分法

一.递归

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

def fn():
    fn()
fn()           #递归深度官方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("\t" * n, i)
            fn(path, n + 1)  # 递归,再一次遍历文件夹内的文件
        else:
            print("\t" * 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))

三.拓展:

扫描二维码关注公众号,回复: 4491754 查看本文章

最快的查找法(在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("没有找到")

  

猜你喜欢

转载自www.cnblogs.com/q767498226/p/10115290.html