Python Goldbach猜想算法每次返回一个不正确的元组

Python Goldbach猜想算法每次返回一个不正确的元组,python,math,python-3.4,Python,Math,Python 3.4,我创建了一个函数来查找所有素数的组合,这些组合加起来就是一个给定的数字。它工作得非常好,除了我返回的第二个元组总是关闭之外。代码的结构方式总是返回给定元组的两种变体,例如(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_

我创建了一个函数来查找所有素数的组合,这些组合加起来就是一个给定的数字。它工作得非常好,除了我返回的第二个元组总是关闭之外。代码的结构方式总是返回给定元组的两种变体,例如(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))
当您在第二个for循环中找到一个与数字相等的
结果时,您可以将其添加到
素数列表中,但如果这是列表中的最后一个素数,则结果不会更改,并且我们退出第二个
for
循环(仍然具有相同的
结果
)在
循环的第一个
的下一次迭代中,取下一个
x
值,但在再次计算
结果
之前,检查
结果
是否等于
数字
,如果是,则追加
x
(新的
x
,而不是用于计算
结果
)和
y
添加到列表中

如果
条件不确定为什么存在,您可以删除该条件

编辑

代码-

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

您还可以为
循环编辑第二个
上的范围,以避免重复

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)]

代码不会运行于数字
3
@Brofessor仅适用于大于
2
的偶数。如果可以删除,请检查编辑后的代码,您还应该仔细阅读答案,以了解错误所在。好的,谢谢。当我回答时,我还没有看到编辑:)我现在看到,不管结果如何,我都在下一个x后面加上了旧的y。太棒了!我有点困惑到底为什么会这样,但确实如此。编辑:算出:)它阻止算法返回并查看低于当前正在比较的数字的数字。