嘿。这个例子非常具体,但我认为它可以应用于广泛的功能。 它来自一些在线编程比赛。如何使这个方法非递归?
有一个简单的获胜条件的游戏。平局是不可能的。游戏不能永远持续下去,因为每一步都会让你更接近终止条件。在给定状态的情况下,该功能应该确定现在要移动的玩家是否具有获胜策略。 在该示例中,状态是一个整数。玩家选择一个非零数字并从数字中减去:新的状态是新的整数。胜利者是达到零的玩家。
我这个编码:
from Memoize import Memoize
@Memoize
def Game(x):
if x == 0: return True
for digit in str(x):
if digit != '0' and not Game(x-int(digit)):
return True
return False
我想很明显它是如何工作的。我也意识到,对于这个特定的游戏可能有一个更聪明的解决方案,但我的问题是一般的。然而,即使对于相对较小的输入,这也会使python变得疯狂。有没有什么办法让这段代码在循环中工作?
感谢
这就是我的意思翻译成一个循环:
def fac(x):
if x <= 1: return x
else: return x*fac(x-1)
def fac_loop(x):
result = 1
for i in xrange(1,x+1):
result *= i
return result
## dont try: fac(10000)
print fac_loop(10000) % 100 ## works
当且仅当起始数十进制数不为零时,起始玩家才有胜利策略。在这种情况下,只需选择这个数字,然后用一个小数点位置的数字填充对手。最终你将滑动到10,你的对手将使它成为9,你通过减去9赢得胜利。如果你从10倍开始,对手有一个对称的胜利策略。 – tomash 2010-08-17 21:31:35