递归和二分法

1. 递归
自己调用自己
递归的重点是    入口(参数) 和 出口(return)
树形结构的遍历

遍历f盘里所有的文件和文件夹
import os
def func(lujing,n):
    lis = os.listdir(lujing)
    for i in lis :
        a = os.path.join(lujing,i)
        if os.path.isdir(a) :
            print("..."* n + i)
            func(a,n+1)
        else :
            print("..."* n + i)
func("f:/",0)

  

 

2. 二分法
掐头结尾取中间
查找效率非常的高  且必须是有序的

lis = [1,65,3,2,1,95,63,8942]
lis1 = list(sorted(lis,key = lambda i:i))
n = int(input("请输入你要查询的数字:"))
left = 0
right = len(lis)- 1
while left <= right :
    mid = (left+right)// 2
    if n > lis1[mid] :
        left = mid + 1
    elif n < lis1[mid] :
        right = mid - 1
    else :
        print("存在的")
        break
else :
    print("不存在")

  

##递归查找   递归时对列表进行切边 必须是有序的
lis = [1,65,3,2,1,95,63,8942]
lis = [1,65,3,2,1,95,63,8942]

def func(x,lis1) :
    if lis1 != [] :
        left = 0
        right = len(lis1)-1
        mid = (left+right)//2
        if x > lis1[mid] :
            del lis1[:mid+1]
            func(x,lis1)
        elif x < lis1[mid] :
            del lis1[mid:]
            func(x,lis1)
        else :
            print("存在")
    else :
        print("不存在")

n = int(input("请输入你要查询的数字:"))
lis2 = list(sorted(lis,key = lambda i:i))
func(n,lis2)

  

###递归查找   递归时,改变列表的索引,用二分法查找.必须是有序的
lis = [1,65,3,2,1,95,63,8942]
lis = [1,65,3,2,1,95,63,8942]
def func(x,lst,left,right):
    if left <= right :
        mid = (left+right)//2
        if x > lst[mid] :
            left = mid +1
            func(x,lst,left,right)
        elif x < lst[mid] :
            right = mid - 1
            func(x,lst,left,right)
        else :
            print("存在")
    else :
        print("不存在")

n = int(input("请输入你要查询的数字:"))
lis2 = list(sorted(lis,key = lambda i:i))
func(n,lis2,0,len(lis2)-1)

  

查找运算最快的方法  这个可以是无序的  

lis = [1,65,3,2,1,95,63,8942]      #先找出这个数列的最大值
lis1 = []                           #创建一个空的列表
for i in range(8942+1):             #对原列表的最大值进行range遍历
    lis1.append(0)                  #每一次遍历都对新列表添加一个元素
for i in lis :                     #对原列表进行编列
    lis1[i] = 1        #把新列表的第i项元素,修改一个值(把原列表的每个元素当成新列表的索引,赋予一个新值)
n = int(input("请输入你要查询的数字:"))     #输入要查询的数字
if lis1[n] == 1 :          #把这个数字当成新列表的索引,看看这个索引对应的值是否为新赋予的值,如果是
    print("存在")          #那这个数字在原列表中是存在的
else :                   #这个数字当成的新列表的索引,这个索引所对应的值不是新赋予的值的话,
    print("不存在")       #这个数字在原列表中是不存在的

  

 

posted on 2018-12-13 17:23  哎呀!土豆  阅读(109)  评论(0编辑  收藏  举报

导航