首页 > 解决方案 > 哥德巴赫猜想在 Python 中最多验证 N

问题描述

我似乎在我的 python 代码中创建了一个无限循环。我的目标是创建一个函数 'check',它使用我之前的 'goldbach' 函数来确认每个大于 4 和输入 N 的偶数都符合哥德巴赫猜想(我知道,这是一个毫无意义的过程,但它是为了我的任务)。我知道我的“goldbach”函数运行良好,并产生一对素数,对于“好”输入,总和为 N,对于“坏”输入,总和为 (0,0)。我希望我的检查函数对所有大于 4 的偶数输入返回 True(因为这些符合猜想),对任何奇数输入返回 False。但是,当我在控制台中尝试检查功能时,我的代码将无法运行,所以出了点问题 - 知道它是什么吗?

def goldbach(N):
    x, y = 0, 0
    result = 0
    if N % 2 == 0:
        prime = odd_primes(N)
        while result != N:
            for i in range(len(prime)):
                if result == N: break
                x = prime[i]
                for j in range(len(prime)):
                    y = prime[j]
                    result = x + y
                    if result == N: break 
    return x, y 

def check(N):
    for n in range(4, N+1):
        if n % 2 ==0:
            g = goldbach(n)
            if g == (0,0):
                return False
            else:
                return True

标签: python

解决方案


检查范围中的第一项后,您将立即返回。False遇到不符合预期的商品需要第一时间退货,True全部符合预期的最后退货。

如果您只想查看偶数,请2range()函数中使用 stride of 而不是测试每个数字以查看它是偶数还是奇数。

def check(N):
    for n in range(4, N+1, 2):
        if goldbach(n) == (0, 0):
            return False
    return True

你不需要while循环 in goldbach()。这两个for循环测试素数的所有组合。如果他们没有找到匹配的配对,则没有理由重新启动它们。

您还可以简化和优化您的循环。内部循环只需要从 开始测试素数x,因为y < x在 的早期迭代中已经测试过的素数对x

def goldbach(N):
    if N % 2 == 0:
        prime = odd_primes(N)
        for i, x in enumerate(prime):
            for y in prime[i:]:
                if x + y == N:
                    return x, y 
    return 0, 0

但是,我认为您的代码应该仍然可以工作,这表明问题实际上odd_primes()是没有将所有素数返回到N.


推荐阅读