我自学MIT Open Courseware Introduction to Computer Science and Programming。 Problem Set 2涉及基于计算鸡块盒总数(6,9或20)的丢番图方程。
我想要创建一个算法的方法就像创建一个虚拟测量棒(就像在木材店中一样),其中测量值(值)在棒上记录,然后转移到另一块。
如果我想象它被用在一个数字线上,它会指出初始值,我会标记这些点,然后,我将零点移动到它遇到的第一个标记并制作新的标记,并重复,总是前进。
所以,采用以下公式:x=0
,a=x+6
,b=x+9
,c=x+20
,每个都附加到列表中,现在看起来像这样:{ {1}}。我当时想要做的是让[6,9,20]
切换到列表中的下一个最大值,为其他变量创建新值,这些变量也会附加到列表中。 x
的下一个值为x
,更改其他变量并生成如下所示的列表:6
。然后,[6,9,20,12,15,26]
,等等。
我的第一个问题是重复和列表的顺序导致无限循环。我通过添加一行创建了一组再次返回列表的列表来更正了这一点。这主要起作用。
但是,这就是问题所在,它并没有填充所有可能的值。例如,它没有将48列入列表,这是6的明显倍数。
我的猜测是,我的问题与我在不断编辑和/或追加的列表上进行迭代这一事实有关。
我知道有些算法我可以使用重新设计作业,因为我做了研究,甚至看到其他人如何编码这个问题的答案,我现在明白了,但我仍然想修复我的自己编写问题解决方案的方法。到目前为止,这是我的代码:
9
答案 0 :(得分:1)
修改你正在迭代的同一个集合几乎总是不是一个好主意,因为迭代期望底层集合不被修改。特别是,在修改它时迭代Python中的列表似乎有......古怪的结果。尝试更改它以显式索引列表并改为增加索引,如下所示:
## Create a list to catch values, aka fish
fish = [0]
## Here goes
x, i = 0, 0
while x <= 60 and i < len(fish):
x = fish[i]
a, b, c = x+6, x+9, x+20
## catch the values into the list
fish.append(a)
fish.append(b)
fish.append(c)
## get rid of duplicate numbers in the list.
fish = sorted(set(fish))
i = i + 1
作为参考,这是我如何解决它。我们想要添加到集合中的数字是那些可以表示为6的倍数+ 9的倍数+ 20的倍数。所以让我们迭代所有这些,然后从我们的集合中创建一个列表所有小于或等于max的元素:
def solvechickenboxes(max, x, y, z):
sums = set()
for a in range((max/x)+1):
for b in range((max/y)+1):
for c in range ((max/z)+1):
sums.add(a*x + b*y + c*z)
return [x for x in sums if x <= max]
solvechickenboxes(50, 6, 9, 20)
[0, 6, 9, 12, 15, 18, 20, 21, 24, 26, 27, 29, 30, 32, 33, 35, 36, 38, 39, 40, 41
, 42, 44, 45, 46, 47, 48, 49, 50]