Ошибки
Есть несколько проблем с вашим кодом, но первая и причина его сбоя заключается в том, что не N% 2 всегда оценивается как ложное для нечетных чисел, пропускаяваш цикл и возвращая начальные значения, которые вы установили x, y и z.
Есть также логические проблемы с ним;ваш код разрывается в самом внутреннем цикле, когда x + y + z == N, тогда внешние циклы прерываются, когда result установлен правильно, но только после изменения x или y!Это означает, что даже если вы исправите первую проблему, ваш код всегда будет возвращать неверный результат.
Неэффективность
Во-первых, вам вообще не нужна сложная логика прерывания!Вы можете просто вернуть x, y, z , когда впервые обнаружите, что сумма равна N .
Во-вторых, вам не нужен результат = x + y codeв среднем цикле, поскольку он не имеет никакого отношения к слабой гипотезе Гольдбаха и никогда не является истинным.
В-третьих, внешний цикл 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)