我试图为弱哥德巴赫猜想编写一个代码,该代码指出,大于5的每个奇数都可以表示为三个质数之和。但是,该代码仅返回(0,0,0)。我只需要一个有效的三元组,而不是一个三元组列表。有什么想法我要去哪里吗?我也知道代码并不是最有效的,尤其是使用eratosthenes函数生成素数,但这是我被要求编写代码的形式。
def eratosthenes(n):
primes = list (range(2, n+1))
for i in primes:
j=2
while i*j<= primes[-1]:
if i*j in primes:
primes.remove(i*j)
j=j+1
return primes
def weak_goldbach(N):
x, y, z = 0, 0, 0
result = 0
if not N % 2:
prime = eratosthenes(N)
while result != N:
for i in range(len(prime)):
x = prime[i]
if result == N:
break
for j in range(i, len(prime)):
y = prime[j]
result = x + y
if result == N:
break
for k in range (j, len(prime)):
z = prime[k]
result = x + y + z
if result == N:break
return x, y, z
答案 0 :(得分:2)
您的代码有一些问题,但是第一个问题以及失败的原因是,不是N%2 总是对奇数求值为false,从而跳过循环并返回初始值设置x,y和z的值。
它也有逻辑上的问题;您的代码在x + y + z == N时在最内部的循环中中断,然后在正确设置 result 时(但仅在更改x或y之后),外部循环中断!这意味着即使您解决了第一个问题,您的代码也始终会返回错误的结果。
首先,您根本不需要复杂的中断逻辑!初次发现它的总和为 N 时,只需返回 x,y,z 。
第二,您不需要在中间循环中使用result = x + y代码,因为它与弱哥德巴赫猜想无关,而且永远都不会成立。
第三,外部的while循环完全没有用。它什么也不做,除了如果内部循环由于某种原因找不到结果而创建一个无限循环。
最好减少嵌套;因此,确保其为大于5的奇数的条件应为负,如果不成立,则应返回异常。这样,函数的主体就不会嵌套在条件中,这使其更具可读性。
def weak_goldbach(N):
x, y, z = 0, 0, 0
result = 0
if not N % 2 or N < 7:
raise Exception("Bad input - must be odd number greater than 5.")
prime = eratosthenes(N)
for i in range(len(prime)):
x = prime[i]
for j in range(i, len(prime)):
y = prime[j]
for k in range (j, len(prime)):
z = prime[k]
if x+y+z == N:
return x, y, z
raise Exception("Looks like %d is the exception to the weak Goldbach conjecture!" % N)