-1

嗨,我是 python 的新手,我很难理解这个简单的 while 循环。这个程序应该计算细菌加倍所需的时间。

time = 0
population = 1000 # 1000 bacteria to start with 
growth_rate = 0.21 # 21% growth per minute
while population < 2000:
    population = population + growth_rate * population 
    print population
    time = time + 1
print "It took %d minutes for the bacteria to double." % time
print "...and the final population was %6.2f bacteria." % population

结果是:

1210.0
1464.1
1771.561
2143.58881

It took 4 minutes for the bacteria to double.
...and the final population was 2143.59 bacteria.

我不明白的是为什么最终结果大于 2000 导致它应该在 2000 年之前停止。我有什么问题吗?

4

7 回答 7

1

因为在您上次迭代之前(下面的#4)它低于 2,000。
迭代#1:1210.0 迭代#2:1464.1 迭代#3:1771.561 迭代#4:2143.58881

另一种方法虽然可能不那么优雅,但可以像这样在您的 While 循环中添加一个中断(假设您所关心的只是不打印任何高于 2,000 的数字):

while population < 2000:
    population = population + growth_rate * population
    if population >= 2000:
        break
    else:
        print population
        time = time + 1
于 2013-12-17T16:11:43.310 回答
1

你的代码写着:“只要人口少于2000,计算下一代人口,然后再检查一次”。因此,它总是会计算出太多的一代。

尝试这个:

while True:
   nextGen = population + growth_rate * population
   if nextGen > 2000: break
   population = nextGen
   print population
   time = time + 1

编辑:

或者要得到确切的结果:

print (math.log (2) / math.log (1 + growth_rate) )

所以整个程序可能是:

import math

population = 1000
growth_rate = 0.21 # 21% growth per minute
t = math.log (2) / math.log (1 + growth_rate)
print 'It took {} minutes for the bacteria to double.'.format (t)
print '...and the final population was {} bacteria.'.format (2 * population)
于 2013-11-12T14:55:59.957 回答
0

在循环的倒数第二次迭代中,人口少于 2,000,因此进行了另一次迭代。在最后一次迭代中,人口超过 2,000,因此循环退出。

如果人口每次增加 1,那么您是正确的;循环将在 2,000 处退出。您可以使用更简单的版本查看此行为:

i = 0
while i < 10:
    i += 1
    print i

改变i增加的数量,看看它是如何变化的。

于 2013-11-12T14:56:59.227 回答
0

所以你的代码就在这里:

while population < 2000:
    population = population + growth_rate*population

假设我们进入了 while 循环,population = 1800,growth_rate = .21。这满足了while循环进入另一个循环的所有要求。但是,在下一行中,您将设置人口 = 1800 +(.21)*1800 等于 2178。因此,当您打印人口时,它会显示 2178,即使它高于 2000

你可以做的是这样的:

while population < 2000:
    if population == population + growth_rate * population < 2000:
        population = population + growth_rate * population 
        time = time + 1
    else:
        break
    print population
于 2013-11-12T15:01:16.970 回答
0

循环是“入口控制”循环的一个while示例。这意味着在进入循环之前检查条件。因此,这意味着如果您的循环条件在上一次迭代期间被违反,但不是在开始时,您的循环将在第一次违反之后终止,而不是在它之前。

这是一个简单的例子:

>>> a = 1
>>> while a < 5:
...     a = a+3
...     print a
... 
4
7

因此,如果您希望循环必须在 a 大于或等于 5 之前退出,您必须检查循环本身并跳出循环:

>>> a = 1
>>> while a < 5:
...     a = a+3
...     if a < 5:
...             print a
...     else:
...             break
... 
4
于 2013-11-12T15:00:35.513 回答
0
time = 0
population = 1000 # 1000 bacteria to start with 
growth_rate = 0.21 # 21% growth per minute
while population != 2*population:
    population = population + (growth_rate * population )
    time = time + 1
print "It took %d minutes for the bacteria to double." % time

我想你现在会得到正确的输出。

于 2017-10-30T14:36:24.150 回答
-1

我认为这是一个简单的数学问题 - 你期望时间是一个整数,尽管它可能是一个浮点数。当人口达到 2000 时,循环不能停止,因为按照您计算它的方式,它永远不会有 2000 的值。

于 2013-11-12T14:56:35.790 回答