好的,非常非常新的编码和python。
此脚本的目标:您需要多少次滚动' x'骰子让它们都具有相同的价值?
这是它尝试做的事情: 从用户那里拿出一些骰子 模拟滚动所有这些骰子 如果所有骰子都匹配,请打印出尝试成功的次数,如果他们不匹配,请重试。
以下是发生的事情:
如果用户输入少量骰子,1-4左右,它可以正常工作。
一旦用户输入5个骰子(或更多),它就会在调用python对象时遇到超过的最大递归深度。错误。它似乎是对random.randint的调用的一部分
我希望有人能就如何避免这个错误给我一些指导,因为我不确定为什么递归变得无限。我试图评论我的代码,以便它有意义(至少对我而言)。
如果重要的话,我在Enthought Canopy环境中使用python 2.6。
{{1}}
答案 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^n
或O(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