首页 > 解决方案 > Python扫雷递归算法超出递归限制

问题描述

我正在尝试使用 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()

代码检查数组中是否有任何隐藏的相邻块显示零。(隐藏的瓷砖用“?”表示)。如果有任何符合这些参数的零,则将显示所有与零相邻的瓷砖。然后它重新启动该功能。一旦整个数组中没有满足参数的零,函数循环就会被打破,代码将继续流动。这超出了递归限制。有什么建议么?

标签: pythonpython-3.xrecursionminesweeper

解决方案


您的测试'?'不受板外索引的保护。在低指数边缘,这会产生环绕的负指数。但是,清除s的代码'?'会检查它的索引,所以任何交叉边缘 0-? 对持续存在和无限递归结果。

在电路板的高索引边缘,读取会失败IndexError(假设没有填充“幽灵单元”),但算法当然会因其搜索顺序而偏向较小的索引,因此它通常不会走那么远。


推荐阅读