所以,我写了一个小程序来找到5,4,3,2,1的最小公倍数:
num = 1
multiples_list = []
for divisor in range(1,6):
multiples_list.append(divisor)
multiple_5 = 5 * num
index = len(multiples_list) - 2
while index > 0:
if multiple_5 % multiples_list[index] == 0:
index -= 1
else:
num += 1
index = len(multiples_list) - 2
if index == 0:
print(multiple_5)
似乎我创造了一个无限循环......但为什么呢?
答案 0 :(得分:2)
我想通了......行
multiple_5 = 5 * num
应该在while循环中,而不是在它之外。因为它在while循环之外,所以当num递增时它永远不会更新。
答案 1 :(得分:1)
好的,让我们逐步完成循环,一次一个循环,看看发生了什么。
循环1:
索引是3,所以multiples_list [index]将是4
multiple_5是5,所以multiple_5%multiples_list [index]将是1
1不等于零,因此num将递增1,index将设置为3
循环2:
索引是3,所以multiples_list [index]将是4
multiple_5是5,所以multiple_5%multiples_list [index]将是1
1不等于零,因此num将递增1并且index设置为3
循环3:
索引是3,所以multiples_list [index]将是4
multiple_5是5,所以multiple_5%multiples_list [index]将是1
1不等于零,因此num将递增1并且index设置为3
所以你看,没有一个循环正在做任何不同的事情,只是稳步增加num的值,你没有在循环中测试,因此循环继续广告。无穷。
答案 2 :(得分:1)
我认为你的算法是:考虑最大数的倍数(这里是5)。当此倍数是所有数字的倍数时停止。
以下是您编写代码的方法。
def lcm(*args):
maxv = max(args)
n = maxv
while any(n % x for x in args):
n += maxv
return n
print lcm(1, 2, 3, 4, 5)
调试代码的一种非常有用的方法是在开始编码之前编写测试。这使您可以确保您的代码在各种情况下都能正常工作,并且当您查看并修复一个问题时,您不会重新引入已修复的错误。我觉得你一直在针对单个例子(1,2,3,4,5)调试你的代码,结果你有点过于专注于它的具体细节。
这是我为检查上述代码而编写的实际测试代码:
cases = [
((1, 2), 2),
((2, 3), 6),
((2, 4), 4),
((2, 3, 4), 12)
]
for xs, want in cases:
if want != lcm(*xs): print('lcm(%s) = %s, want %s' % (xs, lcm(*xs), want))
注意,您不需要任何花哨的东西,只需要知道答案的一堆示例,然后运行它们,看看您的代码是否产生了您期望的相同答案。如果有任何差异,只需打印到控制台即可。随着您变得越来越复杂,您可以使用unittest模块,并将测试分开,但是当您学习它时,快速编写代码会过度。
答案 3 :(得分:0)
我认为你忘了索引从零开始而不是一个。
while index > 0
。开始时,index
将为3
,因为它是5 - 2
。
multiple_5 % multiples_list[index] == 0:
将为False,因为5 % 4 == 1
。索引从零开始,因此multiples_list[3]
为4
。
然后num
再增加1,index
再次成为len(multiples_list) - 2
,3
。