哈嘍,已經(jīng)開(kāi)始閑的蛋疼的筆者開(kāi)始研究同樣蛋疼的算法,學(xué)算法當(dāng)然從二分法開(kāi)始咯
簡(jiǎn)單的說(shuō),二分法就是對(duì)半切割查找(反正我是這么理解的)
先舉個(gè)例子,在展示代碼
比如在1~100之間,要猜的數(shù)字是20,利用二分法就會(huì)有這樣的情況發(fā)生...
S1:在1~100中取中間 50,比較 50 和 20,發(fā)現(xiàn) 20 比 50小,那么20肯定比51小,這樣就排除了 50、51、52....100
S2:在1~49中取中間 25,比較 25 和 20,發(fā)現(xiàn) 20 比 25小,那么20肯定比26小,這樣就排除了25、26、27...49
S3:在1~24中取中間 12 ,比較 12 和 20 ,發(fā)現(xiàn) 20 比 12 大,那么20肯定比11大,這樣就排除了12、11、10...1
S4 :(筆者你是在記流水賬啊,這里跳過(guò))
...
最后,得出了要猜的次數(shù)
好了,上代碼,注釋都在代碼中,并且用了隨機(jī)數(shù)。寫(xiě)的不是特666,就用最簡(jiǎn)單的方式介紹下二分法,寫(xiě)的不好望大佬指正
import random
answer_number = random.randint(1, 100) # 要猜的數(shù)字
print("要猜的數(shù)字 ", answer_number)
guess_list = [i for i in range(1, 101)] # 范圍1-100
min_number = min(guess_list) # 最小數(shù)
max_number = max(guess_list) # 最大數(shù)
mid_number = (max_number min_number) // 2
guess_num = 1 # 猜的次數(shù)
while answer_number != mid_number:
min_number = min(guess_list) # 最小數(shù)
max_number = max(guess_list) # 最大數(shù)
mid_number = (max_number min_number) // 2
print("開(kāi)始的中間數(shù)", mid_number)
guess_num = 1
# 如果猜的數(shù)字小于中間數(shù)
if answer_number < mid_number:
# 最大的數(shù)就變成中間數(shù)-1
# 范圍變成最小的數(shù) - 中間數(shù)-1
# 中間數(shù)變成最大的數(shù)
mid_number = mid_number - 1
print("最大的數(shù) ", mid_number)
guess_list = [i for i in range(min_number, mid_number 1)]
print("范圍 ", guess_list)
print('\n')
elif answer_number > mid_number:
# 最小的數(shù)就變成中間數(shù)
# 范圍變成中間數(shù) - 最大的數(shù)
# 中間數(shù)變成最小的數(shù)
print("最小的數(shù) ", mid_number)
guess_list = [i for i in range(mid_number, max_number 1)]
print("范圍 ", guess_list)
print('\n')
print("猜的數(shù)字是", answer_number)
print("猜了", guess_num, "次")
```
聯(lián)系客服