二分查詢(搜尋)是一種在有序列表中查詢某一特定元素的搜尋演算法。
首先先查找到目標列表的中間元素,如果中間元素正好是要查詢的元素,則返回查詢元素的索引下標,搜尋結束;如果要查詢的元素大於或者小於中間元素,則在列表大於或小於中間元素的那一半中查詢,並且跟開始一樣從中間元素開始比較。如果在某一步驟陣列為空,則代表要查詢的元素不在目標列表中。
這種搜尋演算法每一次比較都使搜尋範圍縮小一半,是一方便快捷的搜尋演算法。
由於這種搜尋的整個過程可以分割成許多個相同的操作流程,所以可以運用遞迴思想使**變得輕盈優雅。
在數學與電腦科學中,遞迴(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...