📜  使用二分搜索的Python猜数游戏(1)

📅  最后修改于: 2023-12-03 15:36:37.919000             🧑  作者: Mango

使用二分搜索的Python猜数游戏

二分搜索是一种高效的搜索算法,被广泛应用于各类算法问题之中。本文将介绍如何用二分搜索实现一个猜数游戏。

游戏规则
  1. 程序随机生成一个1至100之间的整数;
  2. 玩家猜一个数字,程序会告诉玩家猜的数字是太大了还是太小了;
  3. 玩家继续猜数字,直到猜中为止;
  4. 程序记录猜测次数,猜中后给出总共猜测次数。
实现思路

二分搜索算法可以将一个有序数组的搜索时间复杂度优化到O(log n)。我们可以应用这个思想,在每次猜数时使用二分法来缩小搜索区间。

以下是实现过程:

  1. 生成一个1到100的整数,作为程序内部的随机答案,赋值给变量ans。
  2. 定义变量l为1,变量r为100,表示搜索区间为[1,100]。
  3. 进入循环,每次询问玩家猜一个数字,计数器cnt加1。
  4. 对每次猜测的数字num,判断它与答案ans的大小关系:
    • 如果num等于ans,则游戏结束,输出猜测次数cnt;
    • 如果num小于ans,则说明答案在[num+1, r]这个区间内,令l=num+1;
    • 如果num大于ans,则说明答案在[l, num-1]这个区间内,令r=num-1;
  5. 如果没有猜到正确答案,一直进行步骤3-4。
代码演示

下面是完整的Python代码:

import random

ans = random.randint(1, 100)
l, r = 1, 100
cnt = 0

while True:
    num = int(input("请猜一个数字(1-100):"))
    cnt += 1
    if num == ans:
        print("恭喜你,猜对了!你一共猜了%d次" % cnt)
        break
    elif num < ans:
        l = num + 1
        print("猜小了,再试试[%d, %d]中的数字" % (l, r))
    else:
        r = num - 1
        print("猜大了,再试试[%d, %d]中的数字" % (l, r))

在这个程序中,我们通过random.randint()函数生成一个1到100的随机数字。在循环中,每一次询问玩家输入一个数字,如果这个数字等于答案,就输出猜测次数,并结束循环。否则,我们就通过修改搜索区间的方式,缩小答案在其中可能出现的范围,并继续询问玩家猜数,直到猜中为止。

总结

二分搜索是一种非常高效的搜索算法,对于搜索具有单调性的问题尤其有效。通过实现一个简单的猜数游戏,我们可以加深对二分搜索算法的理解。