所以我的程序试图找到Pythagorean Triplet,a^2 + b^2 = c^2
和a+b+c=1000
。所以一切运行良好,但程序在程序运行时很早就找到答案,所以我想以某种方式打破所有循环。我正在尝试简单的布尔方法,但由于某种原因,我的循环在1秒后停止。如果我删除exit = True
,那么一切正常(但显然没有中断)。
P.S。如果我使用简单的0
或1
整数来检查它,那也是同样的问题。
任何人都可以告诉我为什么这不起作用?
i = 0
j = 0
k = 0
exit = False
while (i < 999 and exit == False):
while (j < 999 and exit == False):
while (k < 999 and exit == False):
if i*i + j*j == k*k:
if i + j + k == 1000:
exit = True
ii = i
jj = j
kk = k
k += 1
j += 1
k = 1
i += 1
j = 1
i = 1
print('result: %d^2 + %d^2 = %d^2' % (ii, jj, kk))
答案 0 :(得分:2)
您遇到的具体问题只是您的代码符合您设置的条件,
ii == 0
jj == 500
kk == 500
如果你不想要这个简单的解决方案,你应该在开始时初始化为1
(或者更好的是,发现重要的机会来分解重复并在一个地方设置例如j = 1
)。
答案 1 :(得分:2)
使其成为生成器函数:
>>> def pythagorean_triangles(target):
... for a in range(1, target):
... for b in range(1, target):
... for c in range(1, target):
... if a ** 2 + b ** 2 == c ** 2 and a + b + c == target:
... yield a, b, c
...
>>> triangles = pythagorean_triangles(1000)
>>> next(triangles)
(200, 375, 425)
答案 2 :(得分:1)
函数是执行此早期退出逻辑的好方法。我还将你的循环切换为使用内置的xrange()
,这可以清除你周围的一些逻辑。
def triplet():
for i in xrange(1000):
for j in xrange(1000):
for k in xrange(1000):
if i*i + j*j == k*k:
if i + j + k == 1000:
return (i, j, k)
i, j, k = triplet()
print('result: %d^2 + %d^2 = %d^2' % (i, j, k))
请注意,从这里开始,您可以进行一些优化。
i
和j
一样,您只需要测试一个k
,即k == 1000 - i - j
。i == 1
和j == 2
进行了测试,那么您就不需要测试i == 2
和j == 1
。它们会有相同的结果。此外,如果您想在循环中跳过0
,则可以执行xrange(1, 1000)
。 xrange()
允许您传递开始和结束位置。
答案 3 :(得分:0)
为什么不简单地使用pythonic方法来解决问题:
[(a,b,c) for a,b,c in itertools.product(range(0,999), repeat=3) if (a**2 + b**2 == c**2) and (a + b + c == 1000)]
答案 4 :(得分:0)
你已经建议如何重构代码以避免首先打破循环,我个人会使用生成器函数solution of @pillmuncher(如果仍然考虑使用循环)。
以下是一个如何在不使用布尔标志的情况下中断循环的示例:
i = 1
while i < 999:
j = 1
while j < 999:
k = 1
while k < 999:
if i*i + j*j == k*k and i + j + k == 1000:
ii, jj, kk = i, j, k
else:
k += 1
continue
break
else:
j += 1
continue
break
else:
i += 1
continue
break
print('result: %d^2 + %d^2 = %d^2' % (ii, jj, kk))
或者,在Python 2中使用更整洁的for ... in range(...)
(或更好的xrange
}循环:
for i in range(1, 999):
for j in range(1, 999):
for k in range(1, 999):
if i*i + j*j == k*k and i + j + k == 1000:
ii, jj, kk = i, j, k
else:
continue
break
else:
continue
break
else:
continue
break
print('result: %d^2 + %d^2 = %d^2' % (ii, jj, kk))