如何使这个素数递归函数更有效
How to make this recursion function for prime number more efficient
我有这个代码:
def has_divisors(n, i=2):
"""
Check if a number is prime or not
:param n: Number to check
:param i: Increasing value that tries to divide
:return: True if prime, False if not
"""
if n <= 1:
return False
if i + 1 == n:
return True
if n <= 2 and n > 0:
return True
if n % i == 0:
return False
return has_divisors(n, i + 1)
判断一个数是否为质数,问题是它可以检查一个数是否为质数直到+- 1500,然后它进入最大递归深度错误。有谁知道如何使这段代码更有效率(我不想要完全不同的代码,是的,我知道递归对于这个函数来说不是一个好主意,但我必须使用它)
谢谢!
我实际上只添加了一个条件就提高了效率:
def has_divisors(n, i=2):
"""
Check if a number is prime or not
:param n: Number to check
:param i: Increasing value that tries to divide
:return: True if prime, False if not
"""
if n <= 1:
return False
if i == n:
return True
if n <= 2 and n > 0:
return True
if i * i > n:
return True
if n % i == 0:
return False
return has_divisors(n, i + 1)
感谢所有试图提供帮助的人。
修改来自
的函数
这应该有一个最大递归部门 > 1M
两项改进:
只转到 sqrt(N),并且只检查奇数。
def has_divisors(N, i=3):
if N <= 2:
return False
elif N % 2 == 0: # even
return True
elif i * i > N: # tried all divisors to sqrt,
# must be prime
return False
elif (N % i) == 0: # i is a divisor
return True
else: # recursively try the next ( odd) divisor
return has_divisors(N, i + 2)
你不需要对每个递归做基本的取消资格测试,所以为了让它更有效率,正如你所要求的,我将它转换为:
def has_no_divisors(n):
if n <= 2 or n % 2 == 0:
return n == 2
def has_no_divisors_recursive(n, i=3):
if i * i > n:
return True
if n % i == 0:
return False
return has_no_divisors_recursive(n, i + 2)
return has_no_divisors_recursive(n)
通过将 2 视为特例并仅测试除以奇数,这也应该具有修改后代码的两倍性能(和一半的堆栈使用率)。
我有这个代码:
def has_divisors(n, i=2):
"""
Check if a number is prime or not
:param n: Number to check
:param i: Increasing value that tries to divide
:return: True if prime, False if not
"""
if n <= 1:
return False
if i + 1 == n:
return True
if n <= 2 and n > 0:
return True
if n % i == 0:
return False
return has_divisors(n, i + 1)
判断一个数是否为质数,问题是它可以检查一个数是否为质数直到+- 1500,然后它进入最大递归深度错误。有谁知道如何使这段代码更有效率(我不想要完全不同的代码,是的,我知道递归对于这个函数来说不是一个好主意,但我必须使用它) 谢谢!
我实际上只添加了一个条件就提高了效率:
def has_divisors(n, i=2):
"""
Check if a number is prime or not
:param n: Number to check
:param i: Increasing value that tries to divide
:return: True if prime, False if not
"""
if n <= 1:
return False
if i == n:
return True
if n <= 2 and n > 0:
return True
if i * i > n:
return True
if n % i == 0:
return False
return has_divisors(n, i + 1)
感谢所有试图提供帮助的人。
修改来自
这应该有一个最大递归部门 > 1M
两项改进: 只转到 sqrt(N),并且只检查奇数。
def has_divisors(N, i=3):
if N <= 2:
return False
elif N % 2 == 0: # even
return True
elif i * i > N: # tried all divisors to sqrt,
# must be prime
return False
elif (N % i) == 0: # i is a divisor
return True
else: # recursively try the next ( odd) divisor
return has_divisors(N, i + 2)
你不需要对每个递归做基本的取消资格测试,所以为了让它更有效率,正如你所要求的,我将它转换为:
def has_no_divisors(n):
if n <= 2 or n % 2 == 0:
return n == 2
def has_no_divisors_recursive(n, i=3):
if i * i > n:
return True
if n % i == 0:
return False
return has_no_divisors_recursive(n, i + 2)
return has_no_divisors_recursive(n)
通过将 2 视为特例并仅测试除以奇数,这也应该具有修改后代码的两倍性能(和一半的堆栈使用率)。