1. 程式人生 > >python遞迴和二分法

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))

三.拓展:

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