在this video通过Mathologer上,除其他事项外,无限的款项有在9:25出3和不同的无限资金,当视频突然冻结和大象diety弹出,挑战观众发现的“可能的值”表达式。我写了下面的脚本随着精度逼近最后的三个(即1 + 3 .../2 ...):Python - 如何提高复杂递归函数的效率?
from decimal import Decimal as D, getcontext # for accurate results
def main(c): # faster code when functions defined locally (I think)
def run1(c):
c += 1
if c <= DEPTH:
return D(1) + run3(c)/run2(c)
else:
return D(1)
def run2(c):
c += 1
if c <= DEPTH:
return D(2) + run2(c)/run1(c)
else:
return D(2)
def run3(c):
c += 1
if c <= DEPTH:
return D(3) + run1(c)/run3(c)
else:
return D(3)
return run1(c)
getcontext().prec = 10 # too much precision isn't currently necessary
for x in range(1, 31):
DEPTH = x
print(x, main(0))
现在这个工作完全罚款1 < = x
< = 20ish,但在此之后它开始为每个结果永恒。我意识到这是由于每个DEPTH
级别的函数调用数量呈指数级增长。同样清楚的是,我无法轻松地将系列计算到任意点。然而,在该程序减慢一点对于我来说太早清楚地识别限制它汇聚成系列(这可能是1.75,但是我需要更多的DEPTH
是一定的)。
我的问题是:如何获得尽可能多的从我的脚本越好(性能明智)?
我曾尝试:
1.找到数学解决这个问题。 (无匹配结果)
2.寻找优化递归函数的方法。根据多个来源(例如this),Python默认情况下并未优化尾递归,所以我尝试切换到迭代样式,但我几乎立即想出了如何实现这一点...
任何帮助感谢!
注:我知道我可以去了解这个数学上,而不是“暴力破解”的限制,但我想我的程序运行良好,现在我已经开始......
你可以使用THRE数组存储的前几个(或前几千个)'run1','run2'和'run3'的值。你可以事先或者实时地生成它们,例如通过用'-1'填充你的数组(因为你的函数似乎只取正值),并在调用函数之前查找值,如果它没有存储在数组中还没有存在。 – pie3636
@ pie3636不幸的是,我很难想象这种方法的外观。请将您的评论放在(伪)代码中,以使其更清晰。谢谢! – Michael
请参阅下面的[我的回答](http://stackoverflow.com/a/38897580/2700737)。 – pie3636