Python的算法之二分法


一、算法
什么是算法?算法是高效解決問題的辦法。
算法之二分法針對遞歸的實例
需求:有一個按照從小到大順序排列的數字列表,查找某一個數字
# 定義一個無序的列表
nums = [3,4,5,67,8,9,124,1541,56,23637,7,37,321,21,61,515,1] nums.sort() # 給列表排序
print(nums) # 運行結果:[1, 3, 4, 5, 7, 8, 9, 21, 37, 56, 61, 67, 124, 321, 515, 1541, 23637]
# nums = [-2,3,4,6,13,23,56,74,251,562,7437] # find_num = 13 # 方案一:整體遍歷效率太低 # for num in nums: # if num == find_num: # print("find it") # break # for循環的弊端:效率低,得看運氣。

# 使用二分法:從中間開始找,偽代碼 # def binary_search(find_num,列表): # mid_val=找列表中間的值 # if find_num > mid_val: # # 應該在列表的右半部分查找 # # (1)新列表 = 列表切片右半部分 # # (2)重復本身的代碼(列表) # elif find_num < mid_val: # # 應該在列表的左半部分 # # (3)新列表 = 列表切片左半部分 # # (4)重復本身的代碼(列表) # else: # find_num= mid_val # # 找到了 # print('find it')
# 使用二分法具體實現需求 # nums = [-2,3,4,6,13,23,56,74,251,562,7437] # find_num = 13 # def binary_search(find_num,l): # mid_index = len(l) // 2 # 獲取列表中間值的索引 # # mid_val=找列表中間的值 # mid_val = l[mid_index] # if find_num > mid_val: # # 應該在列表的右半部分查找 # # (1)新列表 = 列表切片右半部分 # l = l[mid_index + 1:] # 列表切片,從中間索引加1處到列表最后。 # # (2)重復本身的代碼(列表) # binary_search(find_num,l) # elif find_num < mid_val: # # 應該在列表的左半部分 # # (3)新列表 = 列表切片左半部分 # l = l[:mid_index] # 列表切片,從列表頭到中間索引處。 # # (4)重復本身的代碼(列表) # binary_search(find_num,l) # else: # find_num= mid_val # # 找到了 # print('find it') # binary_search(find_num,nums)
# 使用交互式程序獲取一個列表的索引值 # >>> nums = [1,2,3,4,5] # 定義一個含有奇數個的列表 # >>> len(nums) // 2 # 獲取這個列表的中間索引值 # 2 # 這個列表的中間索引值是2 # >>> nums = [1,2,3,4,5,6] #定義一個含有偶數個的列表 # >>> len(nums) // 2 # 獲取這個列表的中間索引值 # 3 # 這個列表的中間索引值是3
# 優化:二分法+遞歸解決需求
nums = [-2,3,4,6,13,23,56,74,251,562,7437] find_num = 15
def binary_search(find_num,l): # 查看調用列表的次數
    print(l) # 針對列表索引值超出范圍:IndexError: list index out of range
    if len(l) == 0: print("找的值不存在!!") return mid_index = len(l) // 2  # 獲取列表中間值的索引
    if find_num > l[mid_index]: l = l[mid_index + 1:]  # 列表切片,從中間索引加1處到列表最后。
 binary_search(find_num,l) elif find_num < l[mid_index]: l = l[:mid_index]  # 列表切片,從列表頭到中間索引處。
 binary_search(find_num,l) else: print('find it') binary_search(find_num,nums)
# 第二次優化遞歸實現二分法:加入返回值
nums = [-3,4,7,10,13,21,43,77,89] # find_num = 3
def binary_search(find_num,l): print(l) if len(l) == 0: print("該值不存在!!!") return False mid_index = len(l) // 2

    if find_num > l[mid_index]: l = l[mid_index:1] return binary_search(find_num,l) elif find_num < l[mid_index]: l = l[:mid_index] return binary_search(find_num,l) else: print('find it') return True res = binary_search(7,nums) print(res) """運行結果;沒有return返回None [-3, 4, 7, 10, 13, 21, 43, 77, 89] [-3, 4, 7, 10] find it None """
# 獲取結果的返回值:運行返回值是None?為啥?這要追溯到函數運行時的運行結果,沒有return返回None
"""加入return后運行結果: [-3, 4, 7, 10, 13, 21, 43, 77, 89] [-3, 4, 7, 10] find it True """

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM