2016-01-06 41 views
1

我正在寫岩石剪紙遊戲的代碼。但是當我運行它時,它會陷入無限循環。Python遞歸返回使用dict.get

問題發生在下面的代碼中。爲什麼這段代碼會導致任何輸入值的無限循環? (我的Python版本是3.5.0)

class Peoples(object):    
    def recept(self): 
     u = input('choose..r or s or p: ') 
     print('choice: ',{'r':'rock','s':'scissor','p':'p'}.get(u,'{} (wrong input)'.format(u))) 
     return {'s':0,'r':1,'p':2}.get(u,self.recept()) 

P=Peoples() 
P.recept() 

回答

1

由於get的第二個參數被不管是否將最終由get使用執行。你應該把它分解成多行,因此只遞歸調用必要時:

d = {'s':0,'r':1,'p':2} 
if u in d: 
    return d[u] 
else: 
    return self.recept() 

不過說真的,這將是最好不使用遞歸的一切,因爲你打的最大遞歸深度並在用戶連續選擇足夠次數的輸入後崩潰。

def recept(self): 
    d = {'s':0,'r':1,'p':2} 
    while True: 
     u = input('choose..r or s or p: ') 
     print('choice: ',{'r':'rock','s':'scissor','p':'p'}.get(u,'{} (wrong input)'.format(u))) 
     if u in d: 
      return d[u]