python 递归和二分法查找

 

1. 递归
自己调自己
难点:不好想,需要找规律不好读
2. 二分法
头,结尾,取中间, 不停的改变左和右,间接改变中间,查询效率非常高





1. 递归(方法一:)
# 递归的用处: 遍历树形结构(拿一个数据进行遍历,得到两个结果在进行遍历,得到四个结果...,这是树形结构)
import os
filePath = "d:/untitled"

it = os.listdir(filePath)       # 查看文件夹中的文件,
# print(it)   # 以列表的形式打印

print("__iter__" in dir(it))    # 判断是否可迭代,里面的列表可以迭代, 返回True
for i in it:
    print(i)      # 直接打印,不是以列表的形式





import os
filePath = "d:/untitled"

def read(filePath,n):
    it = os.listdir(filePath)       # listdir 查看(打开)文件夹中的文件
    # print("__iter__" in dir(it))  # 可迭代对象
    # print("__next__" in dir(it))  不是迭代器
    for i in it:
        if os.path.isdir(os.path.join(filePath,i)):        #  isdir 判断是否是文件夹 os.path.join 固定写法(拼接)
            print("\t" * n, i)      # 打印文件夹,
            # print(i)
            # 再次调用本函数
            # read(i)
            read(os.path.join(filePath,i),n+1)  # 拿到路径(用原先的路径+进去的一层文件加,组成一个新的路径)

        else:       # 普通文件, 不是文件夹了
            print("\t"*n,i)        # 递归的出口,递归了一次,n是判断递归的次数

read(filePath,0)
# 解释:
# 就是把一个文件夹打开,判断是否是文件,如果出现了另一个文件夹,然后进行拼接,出现新的路径
# 如果再打开还是文件夹的话,继续拼接,直到出现文件为止,打印出内容.

 

2. 递归(方法二:)

python 递归和二分法查找
import os
filePath = "d:/untitled"
def read(filePath, n):      # n 递归深度
    it = os.listdir(filePath)       # listdir 查看(打开)文件夹中的文件
        # print("__iter__" in dir(it))  # 可迭代对象
    for i in it:    # 打开一层
        # 拿到路径
            fp = os.path.join(filePath, i)  # 拼接
            if os.path.isdir(fp):       # 判断是否是文件夹
                print("\t"*n, i)
                read(fp,n+1)        # 又是文件夹了,继续读取内部的内容,递归入口
            else:
                print("\t"*n,i)        # 递归出口

read(filePath, 1)
遍历树形结构

 

3. 二分查找法

python 递归和二分法查找
# 方法一: (普通方法)
lst= [11,22,33,44,55,66,77,88,99]       # // 地板除
n = 66
left = 0
right = len(lst) - 1        # 长度 - 1 = 索引
count = 1
while left <= right:
    middle = (left + right) // 2
    if n > lst[middle]:
        left = middle + 1
    elif n < lst[middle]:
        right = middle - 1
    else:
        print(count)
        print("存在")
        print(middle)               # middle 是中间索引
        break
    count = count + 1
else:
    print("不存在")





# 方法二: (递归 二分法)
lst= [11,22,33,44,55,66,77,88,99]

def binary_search(left, right, n):
    middle = (left + right)//2
    if left > right:
        print("没有")
        return -1   # 没有会返回-1
    if n > lst[middle]:
        left = middle + 1
    elif n < lst[middle]:
        right = middle - 1
    else:
        return middle   # 有的话,返回输入值的索引
    return binary_search(left,right,n)  # n表示你输入的值,判断的值的索引
print(binary_search(0,len(lst)-1,65))
View Code

 

 

 

 







上一篇:三、k8s集群可用性验证与调参(第一章、k8s高可用集群安装)


下一篇:数据结构-二分查找