实现迭代过程:Python
我用这个代码找到一个数字的最小除数:实现迭代过程:Python,python,recursion,Python,Recursion,我用这个代码找到一个数字的最小除数: def smallestDisvisor(n): return factor(n,2) def factor(n,divisor): if (square(divisor) - n > 0): return n elif (n % divisor == 0): return divisor else: return factor(n,divisor + 1) print
def smallestDisvisor(n):
return factor(n,2)
def factor(n,divisor):
if (square(divisor) - n > 0):
return n
elif (n % divisor == 0):
return divisor
else:
return factor(n,divisor + 1)
print(smallestDisvisor(32452843))
但是,当我使用足够大的值运行此操作时,我会得到:
RecursionError: maximum recursion depth exceeded
[Finished in 0.5s with exit code 1]
我不理解递归错误。这段代码不是在实现一个迭代过程吗
factor(32452843,2) -> factor(32452843,3) -> factor(32452843,4)...
如果没有,我如何实现该算法的迭代过程?正如注释中所述,Python没有尾部递归优化。您看到的错误仅仅是因为堆栈变得太大而无法处理 编辑 下面是一种迭代获取最小因子的方法:
# if you're using python3, import reduce from functools
from functools import reduce
def get_factors(n):
factors = []
i = 2
while i < n:
if (n % i) == 0:
factors.append(i)
if reduce(lambda x,y: x*y, factors) >= n:
return factors
i = i + 1
return factors
#如果您使用的是python3,请从functools导入reduce
从functools导入reduce
def get_系数(n):
因子=[]
i=2
而i=n:
回报率
i=i+1
回报率
这将返回所有因素的列表。要获得最小值,可以查看第一个元素。由于32452843是prime,列表将为空。正如注释中所述,Python没有尾部递归优化。您看到的错误仅仅是因为堆栈变得太大而无法处理 编辑 下面是一种迭代获取最小因子的方法:
# if you're using python3, import reduce from functools
from functools import reduce
def get_factors(n):
factors = []
i = 2
while i < n:
if (n % i) == 0:
factors.append(i)
if reduce(lambda x,y: x*y, factors) >= n:
return factors
i = i + 1
return factors
#如果您使用的是python3,请从functools导入reduce
从functools导入reduce
def get_系数(n):
因子=[]
i=2
而i=n:
回报率
i=i+1
回报率
这将返回所有因素的列表。要获得最小值,可以查看第一个元素。因为32452843是素数,所以列表将是空的。现在我理解了问题:使用递归实现一个迭代过程
是的,你能做到。让您绊倒的是默认的堆栈递归限制。由于对素数N的递归需要sqrt(N)调用,因此您仅限于处理数字现在我理解了问题:使用递归实现迭代过程
是的,你能做到。让您绊倒的是默认的堆栈递归限制。由于素数N的递归需要sqrt(N)调用,因此只能处理数字,必须使用
,而循环代替递归Python没有尾部调用优化(),因此递归不会像您描述的那样展开。你需要使用循环。你是说我们不能用Python实现一个迭代过程吗?实现一个迭代过程非常简单——但这表明你使用了迭代控制结构:例如,实际上,递归过程和递归过程调用是不同的:你必须使用,而不是递归。Python没有尾部调用优化(),所以递归不会像你描述的那样放松。你需要使用循环。你是说我们不能用Python实现一个迭代过程吗?实现一个迭代过程非常简单——但这表明你使用了迭代控制结构:例如,实际上,递归过程和递归过程调用是不同的:请参阅,但迭代过程不应该只使用一个堆栈帧。@sarthak yes,如果它是通过while/for循环构造作为迭代实现的,但这里使用的是递归调用,python不知道如何优化,即使使用尾部递归形式,因此,每次调用都会为您调用的每个函数添加一个新的堆栈帧,而不考虑函数。但迭代过程不应该只使用一个堆栈帧。@sarthak yes,如果它的实现是一个带有while/for循环构造的迭代,但是这里您使用的是递归调用,python不知道如何优化它,即使您使用尾部递归形式,因此每次调用都会为您调用的每个函数添加一个新的堆栈框架,而不管函数是什么。
def smallestDisvisor(n):
return factor(n, 2, [])
def factor(n, divisor, prime_list):
# See whether any prime divides teh current divisor.
# Increment it until we get a new prime.
while any(divisor % prime == 0 for prime in prime_list):
divisor += 1
if (divisor * divisor > n):
return n
elif (n % divisor == 0):
return divisor
else:
return factor(n, divisor + 1, prime_list + [divisor] )
print(smallestDisvisor(32452843))