哈喽,已经开始闲的蛋疼的笔者开始研究同样蛋疼的算法,学算法当然从二分法开始咯
简单的说,二分法就是对半切割查找(反正我是这么理解的)
先举个例子,在展示代码
比如在1~100之间,要猜的数字是20,利用二分法就会有这样的情况发生...
S1:在1~100中取中间 50,比较 50 和 20,发现 20 比 50小,那么20肯定比51小,这样就排除了 50、51、52....100
S2:在1~49中取中间 25,比较 25 和 20,发现 20 比 25小,那么20肯定比26小,这样就排除了25、26、27...49
S3:在1~24中取中间 12 ,比较 12 和 20 ,发现 20 比 12 大,那么20肯定比11大,这样就排除了12、11、10...1
S4 :(笔者你是在记流水账啊,这里跳过)
...
最后,得出了要猜的次数
好了,上代码,注释都在代码中,并且用了随机数。写的不是特666,就用最简单的方式介绍下二分法,写的不好望大佬指正
import random
answer_number = random.randint(1, 100) # 要猜的数字
print("要猜的数字 ", answer_number)
guess_list = [i for i in range(1, 101)] # 范围1-100
min_number = min(guess_list) # 最小数
max_number = max(guess_list) # 最大数
mid_number = (max_number + min_number) // 2
guess_num = 1 # 猜的次数
while answer_number != mid_number:
min_number = min(guess_list) # 最小数
max_number = max(guess_list) # 最大数
mid_number = (max_number + min_number) // 2
print("开始的中间数", mid_number)
guess_num += 1
# 如果猜的数字小于中间数
if answer_number < mid_number:
# 最大的数就变成中间数-1
# 范围变成最小的数 - 中间数-1
# 中间数变成最大的数
mid_number = mid_number - 1
print("最大的数 ", mid_number)
guess_list = [i for i in range(min_number, mid_number + 1)]
print("范围 ", guess_list)
print('\n')
elif answer_number > mid_number:
# 最小的数就变成中间数
# 范围变成中间数 - 最大的数
# 中间数变成最小的数
print("最小的数 ", mid_number)
guess_list = [i for i in range(mid_number, max_number + 1)]
print("范围 ", guess_list)
print('\n')
print("猜的数字是", answer_number)
print("猜了", guess_num, "次")
```
丑到吓哭小女孩 发布了6 篇原创文章 · 获赞 2 · 访问量 1664 私信 关注