我试着在这里修改一个给定的脚本:
How to solve the "Mastermind" guessing game?
当我试图得到以下结果时:
数字=4
变量=10
次_until=100
…我没有任何问题。但当我试图增加'变量'到12个程序停止后,一点点进展。你知道吗
另外,我还有一个问题,如果我将“times\u until”更改为500,程序会给出如下错误:
Traceback (most recent call last):
File "/Users/ivalaostiapytriel/Dropbox/MastermindSolver.py", line 72, in <module>
rungame(hidden_code, strategy_allrand)
File "/Users/ivalaostiapytriel/Dropbox/MastermindSolver.py", line 58, in rungame
restart_game()
File "/Users/ivalaostiapytriel/Dropbox/MastermindSolver.py", line 37, in restart_game
rungame(hidden_code, strategy_allrand)
File "/Users/ivalaostiapytriel/Dropbox/MastermindSolver.py", line 58, in rungame
restart_game()
...
...
restart_game()
File "/Users/ivalaostiapytriel/Dropbox/MastermindSolver.py", line 37, in restart_game
rungame(hidden_code, strategy_allrand)
File "/Users/ivalaostiapytriel/Dropbox/MastermindSolver.py", line 50, in rungame
print ("That's it. After %d tries, I won." % (i+1,))
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/idlelib/PyShell.py", line 1347, in write
return self.shell.write(s, self.tags)
RuntimeError: maximum recursion depth exceeded while calling a Python object
>>>
请注意,我对python不太了解,甚至不太了解。我刚在后大学上过课,但没有其他的经历。只需要将它调整为一个项目,并从中检索一些结果。你知道吗
下面是我改编的代码。如果有人提到我在哪里做错了而导致这些错误,我会很高兴的。你知道吗
import random
#from itertools import izip, imap
try:
# Python 2
from itertools import izip
from itertools import imap
except ImportError:
# Python 3
izip = zip
imap = map
digits = 4
variables = 10
times_until = 500
maxtries = 25
times_done = 0
average_cal = 0
fmt = '%0' + str(digits) + 'd'
searchspace = tuple([tuple(map(int,fmt % i)) for i in range(0,variables**digits)])
def compare(a, b, imap=imap, sum=sum, izip=izip, min=min):
count1 = [0] * variables
count2 = [0] * variables
strikes = 0
for dig1, dig2 in izip(a,b):
if dig1 == dig2:
strikes += 1
count1[dig1] += 1
count2[dig2] += 1
balls = sum(imap(min, count1, count2)) - strikes
return (strikes, balls)
def restart_game():
hidden_code = random.choice(searchspace)
rungame(hidden_code, strategy_allrand)
def rungame(target, strategy, verbose=True):#, maxtries=):
possibles = list(searchspace)
for i in range(maxtries):
g = strategy(i, possibles)
#if verbose:
#print ("Out of %7d possibilities. I'll guess %r" % (len(possibles), g),)
score = compare(g, target)
#if verbose:
#print (' ---> ', score)
if score[0] == digits:
if verbose:
print ("That's it. After %d tries, I won." % (i+1,))
global times_done
times_done += 1
global average_cal
average_cal += (i+1)
if times_done <= times_until:
restart_game()
else:
print ("That's it. Average %f " % (average_cal/times_until,))
break
possibles = [n for n in possibles if compare(g, n) == score]
return i+1
def strategy_allrand(i, possibles):
return random.choice(possibles)
if __name__ == '__main__':
hidden_code = random.choice(searchspace)
rungame(hidden_code, strategy_allrand)
我从代码中了解到,您从函数restart\u game调用函数rungame,如果
从rungame调用restart\u game。所以,若times_until变量超过某个值,则得到最大递归深度超出误差。 您将得到一系列嵌套调用
以增加可以使用的最大递归深度系统设置递归限制功能。但是一个更好的解决方案是用这种方式重写代码 摆脱递归。你知道吗
相关问题 更多 >
编程相关推荐