python练习:验证二分法查找法猜数字

首先,在数学上有一个经典的搜索算法,二分查找法,即每次都猜**(最大值+最小值)/2的那个值,根据反馈的结果大小继续查找,直到找到结果。通过二分查找法,每次获得的搜索范围都比以前要减小一半,当n=1000,logn的值为10,所以最多查找次数不超过10**次,我们来检验一下!

第一步:编写一个二分查找法的小程序

import random
#guessnumber.py
#验证二分法查找法最多次数为logn

"单轮测试结果"
target = random.randint(1,1000)# 随机获得一个1-1000之内的整数作为要被猜的数字
print("target= %d"%target)
guess = random.randint(1,1000)# 随机获得一个1-1000之内的整数作为第一次尝试猜测的数字
count = 0# 赋猜测次数初始值为0次
max = 1000# 赋最大值初始值
min = 0# 赋最小值初始值
while True:
    if guess < target:
        print("guess%d= %d is smaller than target"%(count,guess))
        min = guess# 猜测数字小了,将此次猜测结果赋给min,作为下次最小值
        guess = (guess + max)//2
        count += 1
    elif guess > target:
        print("guess%d= %d is bigger than target"%(count,guess))
        max = guess# 猜测数字大了,将此次猜测结果赋给max,作为下次最大值
        guess = (min + guess)//2
        count += 1
    else:
        print("guess%d= %d is right!"%(count,guess))
        break
print("Total number is %d"%count)

测试结果截图:
在这里插入图片描述
由图可见,次数为8次,确实不超过10次就查找到了准确值。
可这只是一次测试,会不会是偶然,所以要设计一个循环在多次测试中统计结果判断是否都在10次之内。

第二步:编写一个循环测试100次二分查找法的小程序
ps:为了方便我把第一步的程序封装起来,并且为了显示结果简单,删除了每次打印每次输出结果。直接输出最后成功次数。

import random
#guessnumber.py
#验证二分法查找法最多次数为logn


def binary_search():
    "单轮测试结果"
    target = random.randint(1,1000)# 随机获得一个1-1000之内的整数作为要被猜的数字
    # print("target= %d"%target)
    guess = random.randint(1,1000)# 随机获得一个1-1000之内的整数作为第一次尝试猜测的数字
    count = 0# 赋猜测次数初始值为0次
    max = 1000# 赋最大值初始值
    min = 0# 赋最小值初始值
    while True:
        if guess < target:
            # print("guess%d= %d is smaller than target"%(count,guess))
            min = guess# 猜测数字小了,将此次猜测结果赋给min,作为下次最小值
            guess = (guess + max)//2
            count += 1
        elif guess > target:
            # print("guess%d= %d is bigger than target"%(count,guess))
            max = guess# 猜测数字大了,将此次猜测结果赋给max,作为下次最大值
            guess = (min + guess)//2
            count += 1
        else:
            # print("guess%d= %d is right!"%(count,guess))
            break
    # print("Total number is %d"%count)
    if count <= 10:
        return True# 在10次之内返回真
    else:
        return False# 返回假

rcount = 0# 测试成功次数初始值0
ecount = 0# 测试失败次数初始值0
for i in range(100):
    if binary_search():
        rcount += 1
    else:
        ecount += 1
print("success_number:%d,fail_number:%d"%(rcount,ecount))

测试结果:
在这里插入图片描述
可见测试100次全部正确,当然换成一千一万次都会成功的,这里就不演示了,这里代码还可以再封装到类里然后可以用户输入测试次数运行,然后打包成一个测试小软件的样子,有兴趣可以去尝试,这里要用到pyinstaller库打包py文件为exe文件。

一起学python的朋友可以和我这个小白一起,加关注互粉

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Franda914

有钱的捧个钱场,没钱的点的赞

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值