首页 > 解决方案 > 是否可以将这两个函数合并为一个调用另一个函数

问题描述

想知道是否可以将这两个函数合并在一起,它似乎可以通过递归成为一个奇异函数,但我不确定。我并没有真正做很多编程,但这按预期工作,我只是认为将它作为一个单独的功能会很好。只是不确定如何对递归进行编程,任何建议都会非常感谢

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)

标签: python-3.xfunctionrecursion

解决方案


决定采用新方法并解决:

我们可以做得更好——您的解决方案和@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,您可以衡量时间改进。


推荐阅读