嘿。這個例子非常具體,但我認爲它可以應用於廣泛的功能。 它來自一些在線編程比賽。如何使這個方法非遞歸?
有一個簡單的獲勝條件的遊戲。平局是不可能的。遊戲不能永遠持續下去,因爲每一步都會讓你更接近終止條件。在給定狀態的情況下,該功能應該確定現在要移動的玩家是否具有獲勝策略。 在該示例中,狀態是一個整數。玩家選擇一個非零數字並從數字中減去:新的狀態是新的整數。勝利者是達到零的玩家。
我這個編碼:
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