Python:使用递归有效地确定因子之和
如何使该程序在运行时更高效?我个人的想法太多了 我希望能够运行4000多个数字而不超过我的 递归极限 这里有一种方法可以提高程序的效率,但不一定要更快。在您的代码中,递归的基本情况是: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
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)