2017-05-24 24 views
0

爲了教育目的,我正在Python中實現一個tic tac toe遊戲。python:在遞歸函數內返回問題

這是設置玩家X或O的功能是遞歸的:

def set_marker(player,board): 
    print "\nplayer",player 

    x = y = 3 
    while(x not in range(0,3)): 
     x = input("x: ") 
    while(y not in range(0,3)):  
     y = input("y: ") 

    if board[x][y] == 0: 
     board[x][y]=player 
     return board 
    else: 
     set_marker(player,board) 
     # return board 

參數:

board = 2dimensional list ([[0, 0, 0], [0, 0, 0], [0, 0, 0]]) 
player = int (value = '1' or '2') 

如果我把我的「X」到一個已經使用的領域我打電話再次起作用。 在這種情況下發生,我使用的「公告板」在我的主循環再次腳本拋出以下錯誤:

Python: TypeError: 'NoneType' object has no attribute '__getitem__' 

類型主板就是在這種情況下:none。 我通過在else:部分中簡單地返回board解決了該問題。

這裏去我的問題:

我爲什麼要還之內,否則返回板子,因爲我調用函數,直到我回到正常的基板?

回答

2
set_marker(player,board) 

應該是:

return set_marker(player,board) 

否則你只是遞歸調用,而沒有經過結果了。在第一次迭代時,它會進入else,它將調用set_marker,然後可能返回board,此時外部調用將完成而不返回任何內容,因此TypeError

雖然它可能會更好,不使用遞歸:

def set_marker(player,board): 
    print "\nplayer",player 

    x = y = 3 
    while(x == 3 or board[x][y] != 0): 
     while(x not in range(0,3)): 
      x = input("x: ") 
     while(y not in range(0,3)):  
      y = input("y: ") 

     if board[x][y] == 0: 
      board[x][y]=player 
      return board 
+0

謝謝,如果我不使它成爲一個遞歸函數,你會調用函數時做一個循環,直到我的返回值不是沒有了,對吧? –

0

我希望的語法如下:

else: 
     return set_marker(player,board) 

當您導致if語句的第一部分通話,它將返回'board',但該返回值需要通過調用鏈傳回。如果你沒有從else塊返回遞歸調用中找到的值,那麼沒有返回值。