Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
实现迭代过程:Python_Python_Recursion - Fatal编程技术网

实现迭代过程: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))