0

我在网上发现了一些练习题,大部分都可以解决,但这道题难倒了我。它不是家庭作业,所以我没有得到成绩。但是,没有提供解决方案,因此获得答案的唯一方法就是这样做。

该任务要求你写一个问题,玩数字 1-100 的数字猜谜游戏。但是,这个尝试通过区间猜测来猜测用户数,例如[1, 100]使用 生成下一个问题first+last/2

我从该站点运行了一个示例。

想一个介于 1 到 100(含)之间的数字。
用字母 y 或 Y 回答下列问题,用字母 y 或 Y 表示是,用 n 或 N 表示否。
间隔:[1,100]。你的号码 <= 50 吗?y
间隔:[1,50]。你的号码 <= 25 吗?y
间隔:[1,25]。你的号码 <= 13 吗?y
间隔:[1,13]。你的号码 <= 7 吗?n
区间:[8,13]。你的号码 <= 10 吗?n
区间:[11,13]。你的号码 <= 12 吗?y
区间:[11,12]。你的号码 <= 11 吗?y
你的号码是:11

到目前为止,这是我的代码,但我什至不知道从哪里开始,因为 while 循环不断给我一个无限循环。我知道“中间”数字需要是一个整数,否则它将是一个无限循环,但我似乎无法弄清楚如何做到这一点。

x = input("Is your numbr <=50?")
count = 100
while x=="y" or "Y":
    count = count/2
    x = input("Is your number <=",count,"?")
    print(count)

如果有人有任何提示,将不胜感激。

4

3 回答 3

2

问题在这里:

while x=="y" or "Y":

表达式“Y”将始终计算为真。

你要

while x == "y" or x == "Y":

即使这样,当用户键入“N”时,这也会结束循环。一个工作循环将是这样的:

finished = False
while not finished:
    if x == "y":
        upper -= (upper-lower)/2
        # prompt for input
    elif x == "n":
        lower += (upper-lower)/2
        # prompt for input
    if upper == lower or (upper - 1) == lower:
        finished = True
        # final output

您应该能够从那里填写空白。

于 2013-10-02T20:31:09.320 回答
1

一个好主意是有一个简单的while True:循环,在其中您保持最大猜测和最小猜测。然后你问用户他们的数量是否大于两者的平均值。如果是,请将您的最小猜测更新为平均值。如果不是,则将最大猜测值降低到平均值。重复直到两次猜测相等,此时您已经找到了数字,并且可以跳出无限循环。

当然,您必须进行一些简单的奇偶校验,以确保您实际上在每一轮中都改变了您的猜测。您应该真正raw_input()用于字符串,input()用于 python 格式的数据。

于 2013-10-02T20:26:57.627 回答
1

问题的整个想法是保持从 1 和 100 开始的两个“界限”,每次你提出一个问题“你的数字 <= X”时,你都会根据答案丢弃一半的范围,你没有这样做在您当前的解决方案中。

像这样。

lower = 1
high = 100
mid = (high + lower)/2 -> at start it will be 50

如果用户回答“是”,那么您将范围从当前下限到该范围的中间,否则您继续使用从 mid+1 开始到结束的范围,如下所示:

如果用户回答是:

high = mid

如果用户回答否:

lower = mid +1

想法的最后一部分是检测范围lower-high何时仅包含2个数字,或者像这样[11,12]是相同的数字,您使用用户的最终答案来选择正确答案并且程序终止,完整的代码在这里,所以你可以测试它:

found = False
range_lower_bound = 1
range_high_bound = 100

print "Think of a number between 1 and 100 (inclusive)."
print "Answer the following questions with letters y or Y for yes and n or N for no."

while not found:
    range_mid = (range_high_bound + range_lower_bound) / 2
    x = raw_input('interval: [%s,%s]. Is your number <= %s? ' % (range_lower_bound, range_high_bound, range_mid))
    if x.lower() == 'y':
        # Check if this is the last question we need to guess the number
        if range_mid == range_lower_bound:
            print "Your number is %s" % (range_lower_bound)
            found = True
        range_high_bound = range_mid
    # here i'm defaulting "anything" no N for simplicity
    else:
        # Check if this is the last question we need to guess the number
        if range_mid == range_lower_bound:
            print "Your number is %s" % (range_high_bound)
            found = True
        range_lower_bound = range_mid + 1

希望能帮助到你!

于 2013-10-02T20:54:41.157 回答