python:在递归函数中返回问题

时间:2017-05-24 18:30:53

标签: python recursion

出于教育目的,我正在用Python实现一个tic tac toe游戏。

设置玩家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'设置为已经使用的字段,我再次调用该函数。 当这种情况发生并且我在主循环中再次使用'board'时,脚本会抛出以下错误:

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

在这种情况下,董事会的类型是:none。 我只是在board部分返回else:来解决问题。

这是我的问题:

为什么我必须在其他地方返回电路板,因为我正在调用该功能,直到我返回正确的电路板?

2 个答案:

答案 0 :(得分:2)

set_marker(player,board)

应该是:

return set_marker(player,board)

否则你只是递归调用而不传递结果。在第一次迭代中说它进入else,它将调用set_marker,然后可以返回board,此时外部调用将完成而不返回任何内容,因此{{1} }。

虽然不使用递归可能会更好:

TypeError

答案 1 :(得分:0)

我希望使用以下语法:

   else:
       return set_marker(player,board)

当您进行导致if语句的第一部分的调用时,它将返回'board',但该返回值需要通过调用链传播回来。如果你没有从else块返回递归调用中找到的值,那么就不会返回任何内容。