【发布时间】:2019-03-12 14:35:34
【问题描述】:
我正在尝试使用 Python 数组制作扫雷,并成功生成了棋盘和炸弹。但是,我对扫雷的“零递归”有困难。如果您在扫雷中选择 0,它将显示所有相邻的图块,如果任何相邻的图块为 0,它将显示所有与该 0 相邻的图块,依此类推。最终,显示的牌的边缘不能有 0,因为所有与显示为 0 的相邻牌都将被显示。我的递归算法超过了 python 的最大递归深度。代码如下:
def zero():
for y in range(height):
for x in range(width-1):
if hidden[y][x] == 0 and (hidden[y+1][x] == '?' or hidden[y-1][x] == '?' or hidden[y+1][x+1] == '?' or hidden[y-1][x-1] == '?' or hidden[y+1][x-1] == '?' or hidden[y-1][x+1] == '?' or hidden[y][x+1] == '?' or hidden[y][x-1] == '?'):
if y+1 < height:
hidden[y+1][x] = board[y+1][x]
if y-1 >= 0:
hidden[y-1][x] = board[y-1][x]
if y+1 < height and x+1 < width:
hidden[y+1][x+1] = board[y+1][x+1]
if y-1 >= 0 and x+1 < width:
hidden[y-1][x+1] = board[y-1][x+1]
if y-1 >= 0 and x-1 >= 0:
hidden[y-1][x-1] = board[y-1][x-1]
if x+1 < width:
hidden[y][x+1] = board[y][x+1]
if x-1 >= 0:
hidden[y][x-1] = board[y][x-1]
if y+1 < height and x-1 >= 0:
hidden[y+1][x-1] = board[y+1][x-1]
zero()
代码检查数组中是否有任何隐藏的相邻图块显示零。 (隐藏的瓷砖用“?”表示)。如果有任何符合这些参数的零,则将显示所有与零相邻的瓷砖。然后它重新启动该功能。一旦整个数组中没有满足参数的零,函数循环就会被打破,代码将继续流动。这超出了递归限制。有什么建议?
【问题讨论】:
-
不是最好的方法,但应该可以工作:在 for 循环之前设置一个变量
modified = False。如果您真的修改(显示)一个字段,请将其设置为 true。如果设置了modified,则在for循环之后调用zero()。这当然可以在一个简单的循环中完成,而不是递归方法。 -
你没有返回语句,所以每次你点击
zero(),它都会无限递归。您需要为zero()上方的return语句找到合适的位置。 -
老实说,递归是解决某些问题的好方法,但我想我会考虑在这种情况下不使用它。也许让 zero() 返回显示的整数平方数,并将其包装在一个持续运行 zero() 直到返回为 0 的 while 语句中。
-
@UtahJarhead:递归调用受到
if的保护:hidden可能会删除其所有 0/?对以终止递归,这在本质上并非不可信。跨度>
标签: python python-3.x recursion minesweeper