【问题标题】:Printing out prime numbers till N using recursion使用递归打印素数直到 N
【发布时间】:2015-09-27 08:17:47
【问题描述】:
L=[]

def Prime(N):
    a=0
    for i in range(2,N):
        if N%i==0:
            a+=1
        if a>0:
            return False
        else:
            return True

def PrimesList(N):
    if N==2:
        L.append(2)
    elif Prime(N):
        L.append(N)
        return PrimesList(N-1)
    else:
        return PrimesList(N-1)

L.reverse() 
print L 

如果我使用一次,它会给出正确的答案。但是L被保存在全球环境中。使用递归时如何将其带入循环?这个问题对你们大多数人来说可能是基本的,但我是 Python 新手。我应该打印质数直到 N。

【问题讨论】:

  • 您编写的代码将无法运行 --- 例如,第 5 行的 a=0 需要缩进。
  • 为什么要使用递归?只需使用一个简单的循环。顺便说一句,您的Prime 功能可以提高效率。由于缩进错误,很难确切知道您要做什么,但是 1) 它只需要测试直到找到 n 的第一个因子; 2) 如果一个数 n 不是素数,那么它必须有一个因数
  • 另外,请修正缩进。通常的 Python 约定是每个缩进级别使用 4 个空格。

标签: python


【解决方案1】:

我会将它作为第二个参数,使用None 来避免this common issue

def PrimesList(N, L=None):
    if L is None:
        L = []
    ...

然后只需在递归调用中包含L,并确保您在递归结束时使用return L

【讨论】:

    【解决方案2】:

    要打印第一个N 素数,您只需打印第一个N-1 素数并添加下一个素数。然而,为了计算下一个素数,数字列表也很有用,所以除了打印它之外,只需返回列表:

    def printFirstPrimes(N):
        if N == 1:
            result = [2]
        else:
            result = printFirstPrimes(N-1)
            # ... compute next prime here ...
            result.append(next_prime)
        print result
        return result
    

    请注意,这不是 Python 的最佳方法,深度递归效率不高,参考实现 CPython 中未实现尾调用优化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-09
      • 1970-01-01
      • 2014-09-13
      • 2021-12-09
      • 2016-05-07
      • 1970-01-01
      • 2022-01-13
      • 2015-05-07
      相关资源
      最近更新 更多