1. 程式人生 > >0518Python基礎-內置函數-二分查找

0518Python基礎-內置函數-二分查找

call += limit elif iter() lte 簡單 位置 zip

1、昨日內容回顧

len() 測試個數

eval() 去掉字符串的引號,返回內部結果

eval(‘1+1‘) ---> 2

exec() 去掉字符串的引號,執行內部代碼

ret = ‘‘‘ if True:

print(666)

‘‘‘

exec(ret)

range

next()

iter()

reversed() 返回的是叠代器

sorted(iterable,key,reverse) return list key

zip(iter1,iter2,iter3....) 拉鏈方法 叠代器

map(key,iterable) 循環模式。[i for i in iterable] 返回的是叠代器。 key

filter(key,iterable) 篩選模式[i for i in iterable if ...] 返回的是叠代器。 key

min() 最小值,返回是int str。 key

sum(iterable,argv) 求和。

max() 最大值。返回是int str。 key

open() 文件操作

repr 原形畢露。

divmod(被除數,除數) 返回值(商,余數)

dir()

abs() 絕對值。

callable

bytes() str ---> bytes

locals() 當前位置的局部變量。

globals() 全局變量。

2、遞歸函數

遞歸函數:在一個函數裏在調用這個函數本身。自己調用自己

遞歸的最大深度:998

修改默認遞歸深度

import sys

sys.setrecursionlimit(100000)

可以通過這種方式來修改遞歸的最大深度,剛剛我們將python允許的遞歸深度設置為了10w,至於實際可以達到的深度就取決於計算機的性能了。不過我們還是不推薦修改這個默認的遞歸深度,因為如果用997層遞歸都沒有解決的問題要麽是不適合使用遞歸來解決要麽是你代碼寫的太爛了~~~

def foo(n):

print(n)

n += 1

foo(n)

foo(1)

‘‘‘

n = 1 太白 age(1) = 23

n = 2 日天 age(2) = age(1) + 2

n = 3 wusir age(3) = age(2) + 2

n = 4 alex age(4) = age(3) + 2

‘‘‘

def age(n):

if n == 1:

return 23

else:

return age(n-1) + 2

print(age(4)) # 23 + 2 + 2 + 2

"""

def age(4):

if n == 1:

return 23

else:

return age(n-1) + 2 age(4) = age(3) + 2

ret = age(4)

def age(3):

if n == 1:

return 23

else:

return age(n-1) + 2 age(3) = age(2) + 2

def age(2):

if n == 1:

return 23

else:

return age(1) + 2 age(2) = age(1) + 2

def age(1):

if n == 1:

return 23 age(1) = 23

else:

return age(1) + 2

"""

3、二分查找

l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]

你觀察這個列表,這是不是一個從小到大排序的有序列表呀?

如果這樣,假如我要找的數比列表中間的數還大,是不是我直接在列表的後半邊找就行了?

這就是二分查找算法!

那麽落實到代碼上我們應該怎麽實現呢?

簡單版二分法

l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]

print(l.index(66))

count = 0

for i in l:

if i == 66:

print(count)

count += 1

for i in range(len(l)):

if l[i] == 47:

print(i)

break

else:

print(‘找不到....‘)

‘‘‘

目標值:aim = 66

尋找中間索引: min_index = len(l) // 2

aim 與 中間索引對應的值進行比較

aim > l[min_index]:

l[min_index+1:]

aim < l[min_index]:

l[:min_index-1]

aim == l[min_index]

return min_index

‘‘‘

升級版二分法

l1 = [1, 3, 5, 7, 8, 10, 11]

def binary_search(li,aim,start=0,end=None): # 第一次:[1, 3, 5, 7, 8, 10, 11] aim 6,start 0,end 6

第二次:[1, 3, 5, 7, 8, 10, 11] aim 6 start:0,end:3

第三次:[1, 3, 5, 7, 8, 10, 11] aim 6 start:2,end:3

第四次:[1, 3, 5, 7, 8, 10, 11] aim 6 start:3,end:3

第五次:[1, 3, 5, 7, 8, 10, 11] aim 6 start:3,end:3

end = len(li) if end is None else end

mid_index = (end - start) // 2 + start # 第一次 mid 3 第二次:mid 1 第三次:mid:2 第四次:mid:3

if start <= end:

if aim > li[mid_index]:

return binary_search(li, aim, start=mid_index+1, end=end) # 第二次:[1, 3, 5, 7, 8, 10, 11] aim 6 start: 2 end:3

第三次:[1, 3, 5, 7, 8, 10, 11] aim 6 start: 3 end:3

elif aim < li[mid_index]:

return binary_search(li, aim, start=start, end = mid_index) # 第一次:[1, 3, 5, 7, 8, 10, 11] aim 6 start:0,end:3

第四次:[1, 3, 5, 7, 8, 10, 11] aim 6 start:3,end:3

elif aim == li[mid_index]:

return mid_index

else:

return None

print(binary_search(l1,3))

print(binary_search(l1,11))

0518Python基礎-內置函數-二分查找