Python:模型细菌生长,嵌套while循环,逻辑错误

1 投票
1 回答
974 浏览
提问于 2025-04-18 11:20

我需要把细菌生长的情况用光密度来表示。这个问题其实很简单:用户指定每小时的时间,每个表格里的单元格光密度(OD)会增加5%。当某个单元格的光密度达到1.0时,超出的部分会分配给它周围的单元格,分别是上、下、左、右四个方向。如果这些周围的单元格光密度也都是1.0,就不会再继续生长了。这个光密度的表格是方形的,可以有任意大小,而且不会循环回去。

在下面的代码中:

array3是初始的光密度表格,length是行和列的数量。我知道在嵌套的while循环里我犯了逻辑错误,因为只有第一行会更新,而且只更新一次:

elapsed=0
i=0
j=0
hours = input('how many hours do you want to run the experiment for?\n')
increase = 1.05

while elapsed <= hours:
    while i<length:
        while j<length:
            if array3[i, j]<1.0:
                array3[i, j]*=increase
                j+=1
            if array3[i, j]>=1.0:
                array3[i, j]=1.0
                excess=((array3[i, j]*increase)-1)/4
                array3[(i-1), j]+=excess
                array3[(i+1), j]+=excess
                array3[i, (j-1)]+=excess
                array3[i, (j+1)]+=excess
                j+=1
        i+=1
    elapsed+=1

1 个回答

1

正如评论中提到的,问题在于你在循环中增加了计数器变量,但在下一次循环之前没有把它们重置回原来的值。在 while i<length 之前加上 i = 0(对 j 也是一样)就能解决这个问题。不过,我建议你使用 for 循环,这样可以直接遍历变量应该取的值范围。

for elapsed in range(hours):
    for i, j in itertools.product(range(length), repeat=2):
        if array3[i, j] < 1.0:
            array3[i, j] = min(1.0, array3[i, j] * increase)
        else:
            excess = ((array3[i, j] * increase) - 1) / 4
            for di, dj in [(+1,0), (-1,0), (0,+1), (0,-1)]:
                if 0 <= i+di < length and 0 <= j+dj < length:
                    array3[i+di, j+dj] = min(1.0, array3[i+di, j+dj] + excess)

如你所见,我做了一些其他的修改:

  • itertools 非常有用,比如用来遍历两个变量的乘积,比如 ij
  • 你可以使用 min 这个内置函数来限制增长到 1.0
  • 遍历所有 ij 的“增量”,而不是对所有四个邻居使用相同的代码。

撰写回答