Python错误“调用Python对象时超过最大递归深度”

2024-05-08 20:14:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一个代码,它基本上是抛硬币,当它击中正面(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


Tags: 代码inimportnumpyifdef硬币概率
3条回答

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

每个翻转都独立于上一个翻转和下一个翻转,因此我要做的是计算一个几何分布(得到头部直到得到尾部的概率),然后在99%watch this处取CDF

也许这就是为什么你会得到:

maximum recursion depth exceeded in comparison

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

简而言之,更多的递归>;更多的内存使用。 阅读有关错误和简单案例here的更多信息。 正如Julien Sorin所提到的,您可以轻松地对循环执行相同的操作

请注意,当您得到“tails”并开始一个新的“实验”时,以前的调用永远不会返回,它们只是累积,可能直到达到最大递归深度为止

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

问题是这个数字可能高于默认堆栈深度(很可能是~1000;请参见^{}),这就是为什么会出现错误

正如其他人所建议的,您可以简单地使用迭代方法:

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

相关问题 更多 >

    热门问题