首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:突破循环的多个级别

Python:突破循环的多个级别
EN

Stack Overflow用户
提问于 2014-06-11 18:14:25
回答 2查看 868关注 0票数 4

我有一个Miller-Rabin原始测试器的伪代码:

代码语言:javascript
复制
function isPrime(n, k=5)
    if n < 2 then return False
    for p in [2,3,5,7,11,13,17,19,23,29]
        if n % p == 0 then return n == p
    s, d = 0, n-1
    while d % 2 == 0
        s, d = s+1, d/2
    for i from 0 to k
        x = powerMod(randint(2, n-1), d, n)
        if x == 1 or x == n-1 then next i
        for r from 1 to s
            x = (x * x) % n
            if x == 1 then return False
            if x == n-1 then next i
        return False
    return True

但是将其转换到Python是很困难的,因为内部next i循环中的for语句必须中断两个循环。Python中没有goto。在堆栈溢出问题上提出这个问题的其他提问者被告知使用带有returntry/except条件或额外布尔标志的本地函数,但这些解决方案要么不适用于这里,要么会极大地丑化这个可爱的伪代码。

对于这个问题,毕达内的方法是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-11 18:25:06

我认为pythonic方法应该是尝试/除了,可读性更倾向于一种方法或布尔值,但我认为可以通过添加一行来解决这个问题:

代码语言:javascript
复制
    for i in xrange(k):
        x = powerMod(randint(2, n-1), d, n)
        if x == 1 or x == n-1: continue
        for r in xrange(1,s):
            x = (x * x) % n
            if x == 1: return False
            if x == n-1: break #*
        if x != n-1: #added line
            return False
    return True

中断标记为#*的行是有问题的,因为它返回false,但是如果我们修复它,它就像"next i“一样。

tobias_k建议的另一种解决方案是使用for/else:

代码语言:javascript
复制
    for i in xrange(k):
        x = powerMod(randint(2, n-1), d, n)
        if x == 1 or x == n-1: continue
        for r in xrange(1,s):
            x = (x * x) % n
            if x == 1: return False
            if x == n-1: break 
        else: #added line
            return False
    return True

如果循环是break-ed,则不会调用它--只有当它耗尽时才调用它。

票数 3
EN

Stack Overflow用户

发布于 2014-06-11 18:25:22

您可以使用breakcontinue作为for: else

代码语言:javascript
复制
for i from 0 to k
    x = powerMod(randint(2, n-1), d, n)
    # Use 'continue' to go to next i (skip inner loop).
    if x == 1 or x == n-1 then next i
    for r from 1 to s
        x = (x * x) % n
        if x == 1 then return False
        # Use 'break' to exit this loop and go to next i
        # since this loop is at the end of the i loop.
        if x == n-1 then next i
    else:
        # This is only reached if no `break` occurred
        return False
return True
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24169803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档