【问题标题】:How to make this recursion function for prime number more efficient如何使素数的递归函数更有效
【发布时间】:2019-12-17 20:39:18
【问题描述】:

我有这个代码:

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 以内为素数,然后进入最大递归深度误差。有谁知道如何使这段代码更高效(我不想要完全不同的代码,是的,我知道递归对于这个函数不是一个好主意,但我必须使用它) 谢谢!

【问题讨论】:

标签: python recursion primes


【解决方案1】:

我实际上只是通过添加一个条件来提高效率:

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)

感谢所有试图提供帮助的人。

【讨论】:

    【解决方案2】:

    How do I find a prime number using recursion in Python修改函数

    这应该有一个最大递归深度> 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)
    

    【讨论】:

      【解决方案3】:

      您不需要对 每个 递归进行基本的取消资格测试,因此按照您的要求,为了提高效率,我将其转换为:

      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 视为一种特殊情况并仅测试除以奇数,这也应该具有您修改后代码的两倍性能(和一半的堆栈使用量)。

      【讨论】:

        猜你喜欢
        • 2012-03-26
        • 2021-10-10
        • 1970-01-01
        • 2016-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多