Python 错误"maximum recursion depth exceeded while calling a Python object"



我有这个代码,它基本上是投掷硬币,当它击中正面(1),它再次投掷,直到它继续投掷正面的概率低于0.1%,或者当它击中反面,它重新开始。

import numpy

def checkAgain(probability):
if(probability >= 0.1):
runCode()
def flipCoin(successes):
rand = numpy.random.randint(2)
if (rand == 1):
# true
successes += 1
flipCoin(successes)
else:
probability = 50
for i in range(successes):
probability /= 2
print(str(successes) + " " + str(probability) + "%")
checkAgain(probability)
def runCode():
successes = 0
flipCoin(successes)
runCode()

但是代码只在某些时候有效。Most of the time I get this error: maximum recursion depth exceeded in comparison我在网上读到这可以防止"堆栈溢出";但我不知道如何让代码运行,直到概率低于0.1

我认为这个问题有一个概念上的问题。(我可能错了)。

每次投掷都独立于前一次和下一次,所以我要做的是计算一个几何分布(得到正面直到得到反面的概率),然后在99%的情况下取CDF。

可能这就是为什么你得到:

maximum recursion depth exceeded in comparison

如果你想继续这样做,我认为使用while循环可以像其他人指出的那样是一个解决方案。

注意当你得到" tail ";并且开始一个新的"实验",之前的调用永远不会返回,它们只是累积,可能直到达到最大递归深度。

程序在至少连续采样9个"头"时终止。(从probability < 0.1),并且在满足此条件之前的期望试验次数至少为2 ** (9 + 1) - 2 = 1022(在MathSE上的示例计算)。

问题是这个数字可能高于默认的堆栈深度(最有可能是~1000;见sys.getrecursionlimit()),这就是为什么你得到错误。

就像其他人建议的那样,您可以简单地使用迭代方法:

import numpy
successes = 0
while True:
rand = numpy.random.randint(2)

if rand == 1:
successes += 1
else:
probability = 50
for i in range(successes):
probability /= 2
print(str(successes) + " " + str(probability) + "%")

if probability >= 0.1:
successes = 0
else:
break

,甚至可以进一步简化else条件,因为probability >= 0.1只能在successes < 9:

时发生
import numpy
successes = 0
while True:
rand = numpy.random.randint(2)

if rand == 1:
successes += 1
else:        
probability = 50 / (2 ** successes)
print(str(successes) + " " + str(probability) + "%")

if successes < 9:
assert probability >= 0.1
successes = 0
else:
break

简而言之,更多递归——>更多的内存使用。在这里阅读有关该错误和一个简单案例的更多信息。正如Julien Sorin所提到的,你可以很容易地对循环做同样的事情。

最新更新