哥德巴赫猜想算法每次返回一个不正确的元组
Goldbach Conjecture algorithm returning one incorrect tuple each time
我创建了一个函数来查找可以加起来等于给定数字的所有素数组合。它工作得非常好,除了第二个元组 I return 总是关闭。代码的结构方式总是 return 给定元组的两个变体,例如 (5, 13) 和 (13, 5),但这个不正确的元组始终是单独的。
def goldbach_conj(number):
prime_tup_list = []
x, y = 0, 0
result = 0
if not number % 2:
prime_list = list_of_primes(number)
# while result != number:
for i in range(len(prime_list)):
x = prime_list[i]
if result == number:
prime_tup_list.append((x, y))
for j in range(len(prime_list)):
y = prime_list[j]
result = x + y
print("Adding {} and {}.".format(x, y))
print("Result is {}".format(result))
if result == number:
prime_tup_list.append((x, y))
return prime_tup_list
如果我输入 56 作为我的号码,我会得到这个输出:
[(3, 53), (5, 53), (13, 43), (19, 37), (37, 19), (43, 13), (53, 3)]
对于 36 我得到:
[(5, 31), (7, 31), (7, 29), (13, 23), (17, 19), (19, 17), (23, 13), (29, 7), (31, 5)]
第一个 for
循环中的这种情况似乎是导致问题的原因 -
if result == number:
prime_tup_list.append((x, y))
当你找到一个 result
等于第二个 for 循环中的数字时,你将它添加到 prime_tup_list
,但如果那是列表中的最后一个素数,结果没有改变,我们退出第二个 for
循环(仍然是相同的 result
),在第一个 for
循环的下一次迭代中,你将进行下一个 x
值,但在你再次计算 result
之前,你检查 result
是否等于 number
,如果是你追加 x
(新 x
,不是用来计算 result
) 和 y
的那个。
您可以完全删除 if
条件,但不确定它为什么存在。
编辑:
代码-
def goldbach_conj(number):
prime_tup_list = []
x, y = 0, 0
result = 0
if not number % 2:
prime_list = list_of_primes(number)
# while result != number:
for i in range(len(prime_list)):
x = prime_list[i] #if below here is removed.
for j in range(len(prime_list)):
y = prime_list[j]
result = x + y
print("Adding {} and {}.".format(x, y))
print("Result is {}".format(result))
if result == number:
prime_tup_list.append((x, y))
return prime_tup_list
您还可以在第二个 for
循环中编辑范围,以避免重复!
def g(number):
prime_tup_list = []
x, y = 0, 0
result = 0
if not number % 2:
prime_list = list_of_primes(number)
for i in range(len(prime_list)):
x = prime_list[i]
for j in range(i, len(prime_list)):
y = prime_list[j]
result = x + y
print("Adding {} and {}.".format(x, y))
print("Result is {}".format(result))
if result == number:
prime_tup_list.append((x, y))
return prime_tup_list
输出:
分别为56和36
[(3, 53), (13, 43), (19, 37)]
[(5, 31), (7, 29), (13, 23), (17, 19)]
我创建了一个函数来查找可以加起来等于给定数字的所有素数组合。它工作得非常好,除了第二个元组 I return 总是关闭。代码的结构方式总是 return 给定元组的两个变体,例如 (5, 13) 和 (13, 5),但这个不正确的元组始终是单独的。
def goldbach_conj(number):
prime_tup_list = []
x, y = 0, 0
result = 0
if not number % 2:
prime_list = list_of_primes(number)
# while result != number:
for i in range(len(prime_list)):
x = prime_list[i]
if result == number:
prime_tup_list.append((x, y))
for j in range(len(prime_list)):
y = prime_list[j]
result = x + y
print("Adding {} and {}.".format(x, y))
print("Result is {}".format(result))
if result == number:
prime_tup_list.append((x, y))
return prime_tup_list
如果我输入 56 作为我的号码,我会得到这个输出:
[(3, 53), (5, 53), (13, 43), (19, 37), (37, 19), (43, 13), (53, 3)]
对于 36 我得到:
[(5, 31), (7, 31), (7, 29), (13, 23), (17, 19), (19, 17), (23, 13), (29, 7), (31, 5)]
第一个 for
循环中的这种情况似乎是导致问题的原因 -
if result == number:
prime_tup_list.append((x, y))
当你找到一个 result
等于第二个 for 循环中的数字时,你将它添加到 prime_tup_list
,但如果那是列表中的最后一个素数,结果没有改变,我们退出第二个 for
循环(仍然是相同的 result
),在第一个 for
循环的下一次迭代中,你将进行下一个 x
值,但在你再次计算 result
之前,你检查 result
是否等于 number
,如果是你追加 x
(新 x
,不是用来计算 result
) 和 y
的那个。
您可以完全删除 if
条件,但不确定它为什么存在。
编辑:
代码-
def goldbach_conj(number):
prime_tup_list = []
x, y = 0, 0
result = 0
if not number % 2:
prime_list = list_of_primes(number)
# while result != number:
for i in range(len(prime_list)):
x = prime_list[i] #if below here is removed.
for j in range(len(prime_list)):
y = prime_list[j]
result = x + y
print("Adding {} and {}.".format(x, y))
print("Result is {}".format(result))
if result == number:
prime_tup_list.append((x, y))
return prime_tup_list
您还可以在第二个 for
循环中编辑范围,以避免重复!
def g(number):
prime_tup_list = []
x, y = 0, 0
result = 0
if not number % 2:
prime_list = list_of_primes(number)
for i in range(len(prime_list)):
x = prime_list[i]
for j in range(i, len(prime_list)):
y = prime_list[j]
result = x + y
print("Adding {} and {}.".format(x, y))
print("Result is {}".format(result))
if result == number:
prime_tup_list.append((x, y))
return prime_tup_list
输出:
分别为56和36
[(3, 53), (13, 43), (19, 37)]
[(5, 31), (7, 29), (13, 23), (17, 19)]