骰子滚动模拟中的递归错误(在一卷中匹配' x'骰子的时间长度)

时间:2015-12-16 21:25:43

标签: python python-2.7

好的,非常非常新的编码和python。

此脚本的目标:您需要多少次滚动' x'骰子让它们都具有相同的价值?

这是它尝试做的事情: 从用户那里拿出一些骰子 模拟滚动所有这些骰子 如果所有骰子都匹配,请打印出尝试成功的次数,如果他们不匹配,请重试。

以下是发生的事情:

如果用户输入少量骰子,1-4左右,它可以正常工作。

一旦用户输入5个骰子(或更多),它就会在调用python对象时遇到超过的最大递归深度。错误。它似乎是对random.randint的调用的一部分

我希望有人能就如何避免这个错误给我一些指导,因为我不确定为什么递归变得无限。我试图评论我的代码,以便它有意义(至少对我而言)。

如果重要的话,我在Enthought Canopy环境中使用python 2.6。

{{1}}

2 个答案:

答案 0 :(得分:2)

Python有fairly low recursion limit by default (IIRC, 1000 stack frames)。你的代码不会限制递归(没有maximum_attempts检查),所以如果它试图“#t;胜利”的次数太多次,它会达到极限并死亡。

你可以set a higher recursion limit,但这只会略微扩大上限;每增加一个骰子就会减少给定掷骰子赢得1/6的几率,所以你总是赢得一个骰子,两个赢得1/6,三个赢得1/36,四个赢得1/216,五个赢得1/1296等胜利几率迅速下降;更高的递归限制偶尔会偶然失败,并且在大多数情况下它不会为你提供更多骰子的额外容量。

你真的需要放弃递归,转而采用命令式技术。

答案 1 :(得分:0)

在回答您的问题时,避免此错误的最佳方法是避免递归。虽然可以说大多数迭代过程都可以递归完成,但这并不意味着它应该是。

在你的情况下,你试图迭代一段非确定的次数,这可能会随着骰子数量的增加而呈指数级增长,因为骰子卷中的组合数量为6^nO(2^n) n个骰子。

不仅如此,您的迭代很简单,每次只将1个变量(attempts)迭代一次。换句话说,您一遍又一遍地运行完全相同的代码并重复......直到某个停止条件。通常的答案是什么?一个循环。更具体地说,是一个while循环。不需要递归。

所以将代码重组为:

#compares all the items in the list, and see's if they match
def comparelist(dicetoroll,attempts):

    #continue doing this unless break or return
    while True:
        fillthelist(dicetoroll)
        #print statement used to make sure this was running
        print dierolls
        #print statment used to see if this section of code was running
        print(all(dierolls[0] == elem for elem in dierolls))

        #gives a check to make sure the code is running and not stopped by
        #printing a result every 100 attempts
        if attempts%100 == True:
            print attempts
        else:
            pass

        #does the actual check to see if all items in the list are the same
        if all(dierolls[0] == elem for elem in dierolls):
            #if all items in list are the same, go to the results function
            wongame(attempts)
            #break out of the loop
            break
        else:
            #increment the attempts counter, and try again
            attempts += 1
     return #if you want the function to return something