进行二分查找猜测随机数,但猜测次数不匹配
我写了一个简单的猜数字游戏,还有一个方法来进行猜测……
from gasp import *
number = random_between(1, 1000)
guesses = 0
while True:
guess = input("Guess the number between 1 and 1000: ")
guesses += 1
if guess > number:
print "Too high!"
elif guess < number:
print "Too low!"
else:
print "\n\nCongratulations, you got it in %d guesses!\n\n" % guesses
break
根据题目的要求,如果使用正确的策略,最多应该猜11次。我用二分查找的方法来找出正确的数字,但实际上猜的次数从来没有超过10次。为了验证这一点,我做了以下操作,结果出现了一个无限循环。
from gasp import *
guesses = 0
big = 1000
small = 1
while guesses != 11
number = random_between(1, 1000)
while True:
guess = (big + small) / 2
guesses += 1
if guess > number:
print "Too high!"
big = guess
elif guess < number:
print "Too low!"
small = guess
else:
print "\n\nCongratulations, you got it in %d guesses!\n\n" % guesses
break
那么,到底谁对呢?是我哪里出错了,还是说所需的猜测次数根本不能超过10次,题目本身就有问题。
2 个回答
1
我们来看看:
A number between 1 and 1 requires 1 guess
A number between 1 and 3 requires 2 guesses at most
A number between 1 and 7 requires 3 guesses at most
A number between 1 and 15 requires 4 guesses at most
A number between 1 and 31 requires 5 guesses at most
...
换句话说,n
次猜测就足够覆盖从 1
到 (2**n)-1
的范围。
比如说,当 n=10
时,这个范围就是从 1
到 1023
。因为 1023 >= 1000
,所以你关于十次猜测的结论是对的。
不过,你用来验证这个结论的代码有问题,因为每次你要猜下一个数字时,big
、small
和 guesses
这些变量没有重新初始化。此外,与其随机生成数字,不如直接测试从 1 到 1000 的每一个数字,这样你就能有一个确定的算法,运行时间也是有限的。
2
在编程中,有时候我们需要处理一些数据,比如从一个地方获取信息,然后在另一个地方使用这些信息。这个过程就像是把水从一个水桶倒到另一个水桶里。
有些时候,我们会遇到一些问题,比如数据格式不对,或者数据丢失了。这就像是你在倒水的时候,发现水桶有个洞,水漏掉了。为了避免这种情况,我们需要确保在处理数据时,所有的步骤都正确无误。
此外,编程中还有一些工具和方法可以帮助我们更好地管理这些数据。就像是用漏斗来倒水,可以减少溅出来的水。通过使用这些工具,我们可以让我们的程序更加高效和可靠。
总之,处理数据就像是一个精细的过程,需要我们仔细操作,确保每一步都做到位,这样才能得到想要的结果。
>>> from math import log, ceil
>>> ceil(log(1000, 2))
10.0