在Mathologer on的this video中,除其他外,还有3个不同的无限和显示在9:25,当视频突然冻结和大象迪蒂弹出,挑战观众找到“可能的值”的表达式。我写了下面的脚本来近似三个脚本中的最后一个(即1+3…/2…):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在默认情况下不优化尾部递归,所以我尝试切换到迭代样式,但是对于如何立即实现这一点,我已经没有什么想法了。。。在
感谢任何帮助!在
注意:我知道我可以用数学的方法来代替“暴力强制”的限制,但是我想让我的程序运行良好,现在我已经开始。。。在