我似乎在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
答案 0 :(得分:1)
检查范围中的第一项后,您将立即返回。遇到与期望不符的项目时,您需要立即退回False
,如果所有匹配项都与期望不符,则最后返回True
。
如果只想看偶数,请在2
函数中使用range()
的步幅,而不要测试每个数字是偶数还是奇数。
def check(N):
for n in range(4, N+1, 2):
if goldbach(n) == (0, 0):
return False
return True
您不需要while
中的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
。
答案 1 :(得分:0)
我刚刚为您的函数odd_primes(N)
创建了一个替换项,以返回所有小于或等于N的质数的列表(其中的2似乎没有什么区别)。您的check()
函数似乎正在检查4到N之间的所有整数,如果发现没有找到戈德巴赫总和的对象,则返回False
。但是,正如其他人指出的那样,一旦找到一对,它也会立即返回True
。因此,当您运行check()
时,会以数字4开头,发现其Goldbach对为(2,2),然后通过返回True
并忽略4之间的任何其他值,立即退出函数。和N。
当我将return True
替换为print
语句并在整个循环后添加`return True:
def check(N):
for n in range(4, N+1):
if n % 2 ==0:
g = goldbach(n)
if g == (0,0):
print("No sum found for %d !" % n)
return False
else:
print("%d is equal to %d + %d" % (n, g[0], g[1]))
return True
然后运行check(20)
例如,我得到:
4 is equal to 2 + 2
6 is equal to 3 + 3
8 is equal to 3 + 5
10 is equal to 3 + 7
12 is equal to 5 + 7
14 is equal to 3 + 11
16 is equal to 3 + 13
18 is equal to 5 + 13
20 is equal to 3 + 17
顺便说一句,如果您只是想知道是否可以将给定的偶数写成两个素数之和,但是您不关心实际的素数对是什么,则可以执行以下操作:>
def goldbach(N):
if N % 2 == 0:
primes = odd_primes(N)
# Generate a list of all the i+j sums where j >= i (skipping
# most duplicates this way), and see if N is among the sums.
sums = [i + j for i in primes for j in primes[primes.index(i):]]
return(N in sums)
else:
print("N must be even.")
return(False)