用布尔值打破嵌套的while循环

时间:2014-07-10 21:56:49

标签: python

所以我的程序试图找到Pythagorean Triplet,a^2 + b^2 = c^2a+b+c=1000。所以一切运行良好,但程序在程序运行时很早就找到答案,所以我想以某种方式打破所有循环。我正在尝试简单的布尔方法,但由于某种原因,我的循环在1秒后停止。如果我删除exit = True,那么一切正常(但显然没有中断)。

P.S。如果我使用简单的01整数来检查它,那也是同样的问题。 任何人都可以告诉我为什么这不起作用?

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))

5 个答案:

答案 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))

请注意,从这里开始,您可以进行一些优化。

  • ij一样,您只需要测试一个k,即k == 1000 - i - j
  • 如果您已经对i == 1j == 2进行了测试,那么您就不需要测试i == 2j == 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))