简体   繁体   中英

Is it possible to merge these two functions as one calls on another

Would like to know if it is possible to merge these two functions together it seems like it could be a singular function through recursion but i'm not sure. I don't really do a lot of programming but this works as intended i just thought it would be nice to have it as a single function. Just not sure how to program recursion any advice would be great thanks

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)

Decided on a new approach and solved:

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)

Decided on a new approach and solved:

We can do better -- your solution, and that of @ikuamike, have the same issue. These lines in particular are inefficient:

for i in A:
    if i % A[k] == 0 and i > A[k]:

First, when possible, we should do an easier test before a harder test, so the if should really be:

for i in A:
    if i > A[k] and i % A[k] == 0:

to do the comparison (subtraction) test ahead of the modulus (division) test. (Why do all those divisions when you don't need too?)

The next issue is that all the numbers from A[0] to A[k] don't need to be tested as they're eliminated by the comparison, so why not leave them out in the first place:

    for i in A[k + 1:]:
        if i % A[k] == 0:

Revised code:

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

With N set to 10,000, you can measure the time improvement.

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)

This should work well for you, I just replaced the for loop in seive onto the primelist function.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM