是否可以将这两个功能合并为一个调用

时间:2018-08-18 18:57:07

标签: python-3.x function recursion

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

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)

2 个答案:

答案 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循环替换成素数函数中的一个。