简体   繁体   中英

Finding the sum of prime numbers between m and n (m and n included in the sum)

def isPrime(n, i):
    if i == n-1:
        return ("True")
    elif n%i == 0:
        return ("False")
    else:
        return isPrime(n, i+1)

def sumOfPrime(m,n):
    if m > 0 and n > 0 and m <= n:
      if isPrime(m,2)==True:
        temp = temp + m
        return temp
      else:
        return (sumOfPrime(m+1,n))
    else:
      return temp

how can I fix the error "UnboundLocalError: local variable 'temp' referenced before assignment" without using a global variable

I reviewed your code, and this is my proposal:

def isPrime(n, i=None):
    if i is None:
        i = n - 1
    while i >= 2:
        if n % i == 0:
            return False
        else:
            return isPrime(n, i-1)
    else:
        return True

def sumOfPrime(m, n):
    sum = 0
    for value in range(m, n+1):
        if isPrime(value):
            sum = sum + value
    return sum


# --- test ---
result = sumOfPrime(1, 9)
print (result) # <-- prints 18

If the difference between m and n is quite high, then it is recommended that you use some type of sieve, to filter primes out in a given range. Otherwise, iterating over numbers from m to n and checking if the number is prime, it is going to be expensive for large m and n .

def is_prime(n):
    if n <= 2:
        return n > 1
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:
            return False
    return True


def prime_range_sum(m, n):
    return sum(i for i in range(m, n + 1) if is_prime(i))


print(prime_range_sum(1, 9))
# prints 17

Here's my version, which I kept as close as possible to the original, while fixing some errors and making some adjustments.

def isPrime(n, i=2):    # since you always use 2, just make it default
    if i == n-1:
        return True     # return a boolean True instead of a string
    elif n%i == 0:
        return False    # return a boolean False instead of a string
    else:
        return isPrime(n, i+1)

   
def sumOfPrime(m,n,total=0):    # we will need to carry the total around, make default to 0
    if 0 < m <= n:              # we can simplify this complex condition
        if isPrime(m):
            total += m              # if it's prime, increase the total...
        return sumOfPrime(m+1, n, total)   # and pass it to the next recursion
    return total               # if this is the last recursion, return total


# Example run
total = sumOfPrime(10,45)
print(total)    # prints 264

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