Python 二分查詢 涉及遞迴思想

2021-10-16 22:06:42 字數 2320 閱讀 7000

二分查詢(搜尋)是一種在有序列表中查詢某一特定元素的搜尋演算法。

首先先查找到目標列表的中間元素,如果中間元素正好是要查詢的元素,則返回查詢元素的索引下標,搜尋結束;如果要查詢的元素大於或者小於中間元素,則在列表大於或小於中間元素的那一半中查詢,並且跟開始一樣從中間元素開始比較。如果在某一步驟陣列為空,則代表要查詢的元素不在目標列表中。

這種搜尋演算法每一次比較都使搜尋範圍縮小一半,是一方便快捷的搜尋演算法。

由於這種搜尋的整個過程可以分割成許多個相同的操作流程,所以可以運用遞迴思想使**變得輕盈優雅。

在數學與電腦科學中,遞迴(recursion)是指在函式的定義中使用函式自身。

實際上,遞迴,顧名思義,其包含了兩個意思:遞和歸,這正是遞迴思想的精華所在。

簡而言之就是定義乙個函式,在其中定義乙個條件,滿足該條件將會返回該函式函式名,即函式呼叫函式本身。需要注意的是,定義的遞迴函式必須有明確的結束條件,否則就會導致無限遞迴的情況。

1). 明確遞迴終止條件

遞迴就是有去有回,因此必然應該有乙個明確的臨界點,程式一旦到達了這個臨界點,就不用繼續往下遞去而是開始實實在在的歸來,防止無限遞迴。

2). 在遞迴終止時提供處理辦法

由於在遞迴函式中存在臨界點,當滿足臨界點時,我們應該給出問題的解決方案。一般地,在這種情境下,問題的解決方案是直觀的、容易的。

3). 提取重複的邏輯,縮小問題規模*

由於遞迴問題一定可以分解為若干個規模較小、操作流程相同的子問題,這些子問題可以用相同的解題思路來解決。從程式實現的角度而言,我們需要抽象出乙個乾淨輕盈的邏輯,以便使用相同的方式解決子問題。

二分法查詢:輸入乙個有序的元素列表(必須有序),如果要查詢的元素包含在其中,二分法查詢返回其位置,否則返回none。

def

findnum

(lst, a, b, num)

:"""

定義乙個函式,使用二分法查詢某元素在有序列表中的位置

:param lst: 有序列表

:param a: 列表的起始位置

:param b: 列表的結束位置

:param num: 要查詢的元素

:return: 返回要查詢的元素在有序列表中的位置

"""# 當要查詢的元素在目標列表中時

if num in lst:

# 找出目標列表中間元素的下標

middle =

int(

(a + b)/2

)# 如果要查詢的元素等於中間元素

if lst[middle]

== num:

return

'輸入數字在列表中的索引是%d'

% middle

# 如果要查詢的元素大於中間元素

elif lst[middle]

< num:

return findnum(lst, middle, b, num)

# 如果要查詢的元素小於中間元素

else

:return findnum(lst,

0, middle, num)

# 當要查詢的元素不在目標列表中時

else

:return

none

# 隨機定義乙個有序列表

lst1 =[1

,5,8

,12,26

,45,86

,112

,258

,598

,698

]num1 =

int(

input

('請列表中輸入乙個數字:'))

# 呼叫函式並輸出

print

(findnum(lst1,0,

len(lst1)

,num1)

)

當要查詢的元素在目標列表中時

輸入數字:26

當要查詢的元素不在目標列表中時

輸入數字:4561

python遞迴查詢 python 遞迴,二分查詢

print list 胡辣湯 lst 河南話 四川話 東北 山東 上海 r reversed lst print list r huiwen 不是上海自來水來自海上 s huiwen 1 it reversed huiwen 返回的是迭代器 s for el in it s el print s l...

Python遞迴實現二分 查詢

週末休息,習慣性的寫點短 data 1,3,5,6,7,9 min 陣列的最小索引 max 陣列的最大索引 data 原陣列 key 需要查詢的數 函式返回值是所在值在陣列中的位置 def search min,max,data,key mid min max 2 if mid 0 return m...

python 遞迴與 二分查詢

遞迴 與 演算法 遞迴 n 1 金老闆 38 2 40 n 2 alex n 2 金老闆 36 2 38 n 3 wusir n 2 alex wusir 36 def age n n 2 if n 3 return 36 else return age n 1 2 jin age age 1 40...