对于for循环中range()的某些值,我的代码不会运行

2024-05-03 05:22:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我创建了一个小游戏,让电脑猜出我选择的数字(在1到100之间)。为了提高效率,我让它的第一次猜测总是50,然后它试图通过猜测他最后一次猜测和他能猜到的“更高”或“更低”数字之间的中点来猜测(我知道,这不是一个很好的解释,但你会看到下面的代码)。你知道吗

不管怎样,我注意到它总是能在最多7次尝试中找到答案,至少在我选择的几个数字的情况下。为了验证这个假设,我写了下面的代码:

def take_guess(lower, higher):
    return lower + (higher - lower)/2

lower = 0
higher = 100
t = 1
l = []

for i in range(1,100):
    while True:
        guess = take_guess(lower, higher)
        if guess == i:
            l.append(t)
            t = 1
            break
        elif guess > i:
            higher = guess
            t += 1
            continue
        elif guess < i:
            lower = guess
            t += 1
            continue

print sorted(l)[-1]

问题是,它只能在范围(1,2)或范围(1,3)下运行。如果射程再大,它就跑不动了。有什么原因吗?你知道吗


Tags: 答案代码returndef情况数字lower小游戏
3条回答

您的代码也在将猜测与i进行比较。让我们跟随它完成循环:

第一次猜测=50;i=1

二次猜测=25;i=2

三次猜测=12.5;i=3

在这一点上,猜测不再是一个整数,它永远不会匹配。你知道吗

您可能应该先定义它猜测的数字,或者将其设置为随机数,然后重试:

import random
answer = random.randint(1,100)

你的代码非常正确。您只是忘记了在递增i时重置higherlower的值。你知道吗

下面是代码的工作版本(用于python2)

def take_guess(lower, higher):
    return lower + (higher - lower)/2

lower = 0
higher = 100
t = 1
l = []

for i in range(1,100):
    ###########################
    # This is the only change!
    lower = 0
    higher = 100
    ###########################

    while True:
        # You can watch exactly what's happening by uncommenting the following line:
        # print("i={}\t lower={}\t higher={}".format(i, lower, higher))
        guess = take_guess(lower, higher)
        if guess == i:
            l.append(t)
            t = 1
            break
        elif guess > i:
            higher = guess
            t += 1
            continue
        elif guess < i:
            lower = guess
            t += 1
            continue

print sorted(l)[-1]

当i的值变为3时,lower=1,higher=3,所以guess=2。现在由于guess小于i,guess=lower=2。但是,guess仍然是2,因为2+1/2=2,所以它进入无限循环,因为guess的值永远不会改变,也就是说guess<;我和你被困在相同的条件下,因为guess总是2,我总是3。你知道吗

相关问题 更多 >