想知道是否有可能将这两个函数合并在一起,似乎通过递归可能是一个奇异函数,但我不确定。我实际上并没有做太多的编程,但这可以按预期工作,我只是认为将其作为单个函数会很好。只是不确定如何对递归进行编程,任何建议都将非常感谢
def sieve(A, n):
for i in A:
if i % n == 0 and i > n:
A.remove(i)
return A
def primelist(N):
A = [i for i in range(2, N + 1)]
for i in A:
A = (sieve(A, i))
print(A)
决定采用新方法并解决:
def primelist(N):
k = 0
A = [i for i in range(2, N + 1)]
while k < len(A):
for i in A:
if i % A[k] == 0 and i > A[k]:
A.remove(i)
k += 1
return(A)
答案 0 :(得分:1)
决定采用新方法并解决:
我们可以做得更好-您的解决方案和@ikuamike的解决方案都存在相同的问题。这些行尤其无效:
for i in A:
if i % A[k] == 0 and i > A[k]:
首先,在可能的情况下,我们应该先进行更简单的测试,然后再进行更困难的测试,因此if
的确应该是:
for i in A:
if i > A[k] and i % A[k] == 0:
在模量(除法)测试之前进行比较(减法)测试。 (为什么在您也不需要时进行所有这些划分?)
下一个问题是,A[0]
至A[k]
中的所有数字都不需要进行测试,因为它们已被比较所消除,所以为什么不首先将它们排除在外:
for i in A[k + 1:]:
if i % A[k] == 0:
修改后的代码:
def primelist(N):
k = 0
A = [i for i in range(2, N + 1)]
while k < len(A):
for i in A[k + 1:]:
if i % A[k] == 0:
A.remove(i)
k += 1
return A
在N设置为10,000的情况下,您可以测量时间改进。
答案 1 :(得分:0)
def primelist(N):
A = [i for i in range(2, N + 1)]
new_a = A
for i in A:
for n in new_a:
if n % i == 0 and n > i:
new_a.remove(n)
print(new_a)
这应该对您来说很好,我只是将for循环替换成素数函数中的一个。