Python:使用递归有效地确定因子之和

Python:使用递归有效地确定因子之和,python,recursion,Python,Recursion,如何使该程序在运行时更高效?我个人的想法太多了 我希望能够运行4000多个数字而不超过我的 递归极限 这里有一种方法可以提高程序的效率,但不一定要更快。在您的代码中,递归的基本情况是: def sof (x, fact): if x % fact == 0: if fact >= x/fact: return fact + x/fact + sof (x,fact - 1) else: return 1

如何使该程序在运行时更高效?我个人的想法太多了

我希望能够运行4000多个数字而不超过我的 递归极限

这里有一种方法可以提高程序的效率,但不一定要更快。在您的代码中,递归的基本情况是:

def sof (x, fact):
    if x % fact == 0:
        if fact >= x/fact:
            return fact + x/fact + sof (x,fact - 1)
        else:
            return 1
    else:
        return sof (x,fact-1)
嵌套在余数检查中:

if fact >= x // fact:
使您的代码能够不断检查不需要的数字。例如,考虑一个大素数* 2 -你的代码一直检查直到事实达到1而不是中点。 对于这个算法可以在堆栈溢出之前处理的小数字来说,这不是一个速度问题。您只到达1999年,超过1999年,堆栈将溢出,而我的重新排列:

if x % fact == 0:
可以使用相同的堆栈大小达到2086,因为它避免了那些额外的递归


当您通过sys.setrecursionlimit扩展堆栈时,这种差异会增加

第一步是让它工作。现在,它没有。用x=4试试。你需要坚持递归吗?这个程序可以迭代完成,这样可能效率更高,因为Python不做任何尾部调用消除。它必须是递归的吗?对不起,我从开始的文章中排除了一些信息。X必须是intmath.ceilx/2。添加的除数必须是正确的除数。是的,它必须是递归。不过,我在一些数字上遇到了麻烦。@Blckknght:缺少尾部调用消除不会影响算法的复杂性;它所做的只是添加一个小的常量乘数,当然,将其限制为1000步。
def sof(number, divisor):
    dividend = number // divisor

    if dividend > divisor:
        return 1

    if number % divisor:
        return sof(number, divisor - 1)

    return divisor + dividend + sof(number, divisor - 1)