如何解决Python中的列表范围-Euler 007项目
| 这里的第一个问题。我正在尝试通过逐步进行euler项目来学习python,但遇到了障碍。下面的方法(返回一个主要因子列表)对于一个调用很有效:def findPrimeFactors(num,primeFactors = []):
\'\'\'Find the prime factors of an arbitrary positive integer
input: num to factorize
returns: a list containing the prime factors of the number
\'\'\'
pIndex = 2
while (num >= pIndex):
if num % pIndex == 0:
num /= pIndex
primeFactors.append(pIndex)
return FindPrimes.findPrimeFactors(num,primeFactors)
else:
pIndex += 1
return primeFactors
但是,当我在循环中使用它时,就像这样(此方法可能尚未完成,由于无法找到更多的质数,当前会导致无限循环):
def countPrimes(n = 1001):
\'\'\'find n amount of unique primes ascending
input: number of primes to find
returns: list of n primes starting from 2 \'\'\'
primes = []
i = 2
while len(primes) < n:
primeFactors = FindPrimes.findPrimeFactors(i)
print(primeFactors) #verify method behavior
if len(primeFactors) is 1:
primes.append(primeFactors[0])
i += 1
return primes
结果是第一个循环返回[2],下一个循环返回[2,3],依此类推,将新结果附加到我希望在第一次递归调用中为空的列表中。我的名单似乎还在保留,但我不确定为什么吗?我也阅读了Python类的作用域和列表,这为我提供了一些线索,但是递归使它更加复杂。
递归还意味着我也不能简单地为其分配一个空集。来自C ++背景,我期望每次从我的程序中调用函数时,都要重新初始化primeFactors变量。这里还是一条小蛇。
编辑:这是我写的findPrimeFactors的迭代版本。我知道这不是最佳方法-但我至少想使其效率足够达到欧拉计划的1分钟规则。任何改进或清楚的建议都值得赞赏。
PRIMES = [2,3,5,7,11,13,17,19]
import math
class FindPrimes():
\'\'\'V2 iterative\'\'\'
def findPrimeFactors(n,primeFactors = None):
\'\'\'Find the prime factors of an arbitrary positive integer
input: num to factorize
returns: a list containing the prime factors of the number
\'\'\'
if primeFactors is None:
primeFactors = []
num = n
ceil = math.sqrt(n) #currently unused
global PRIMES
knownPrimes = PRIMES
#check known primes for divisors first,then continue searching for primes by brute force
while True:
factorFound = False
for prime in knownPrimes:
if num % prime == 0:
primeFactors.append(prime)
num /= prime
factorFound = True
break #ensure that the list returned has ascending primes
if not factorFound:
break
#once attempts have been made to reduce using known primes
#search for new primes if the number is not fully reduced
i = knownPrimes[-1] + 2
while num != 1:
if num % i == 0:
knownPrimes.append(i)
primeFactors.append(i)
num /= i
i += 2
return primeFactors
def countPrimes(n = 10001):
\'\'\'find n amount of unique primes ascending
input: number of primes to find
returns: list of n primes starting from 2 \'\'\'
primes = []
i = 2
while len(primes) < n:
primeFactors = FindPrimes.findPrimeFactors(i)
if len(primeFactors) == 1:
primes.append(primeFactors[0])
#print(primeFactors[-1])
i += 1
print(len(primes))
return primes
nth = 10001
print(FindPrimes.countPrimes(nth)[nth-1]) #print the largest prime found
解决方法
请参见“最少惊讶”和可变默认参数
, calls3ѭ的默认值是在呼叫之间共享的,因此当您更改它时,它将在以后的呼叫中保持不变。
例:
def foo(bar = []):
bar.append(1)
return bar
print foo()
print foo()
输出:
[1]
[1,1]
您应该返回一个新列表,而不是更改默认列表:
def foo(bar = []):
return bar + [1]
print foo()
print foo()
输出:
[1]
[1]
, 如hammar所提到的,默认值仅在定义函数时创建一次,并在调用之间共享。
解决该问题的通常方法是使用标记值作为默认值:
def findPrimeFactors(num,primeFactors=None):
if primeFactors is None:
primeFactors = []
...
题外话,但您的函数findPrimeFactor()
将对找到的每个素数因子递归一次。 Python不会删除尾调用,因此您可能应该使用迭代而不是递归来重写它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。