以递归方式搜索特定元素的2D列表

时间:2014-03-28 17:20:28

标签: python recursion

名为findStart()的函数假设以递归方式搜索表示迷宫的二维列表。它假设搜索此列表并找到x&列表中特定元素的y(第一和第二索引)为“S”。但是它假设使用递归,而findStart()方法则不接受任何参数。我已经发现如何使用迭代来完成它但是如何将这个迭代变成递归呢?

def findStart():
    for a in mazeList:
        for x in a:
            if x == "S":
                xcoord = a.index("S")
                ycoord = mazeList.index(a)
                return (ycoord),(xcoord)
    return -1,-1

迷宫:

####################################
#S#  ##  ######## # #      #     # #
# #   #             # #        #   #
#   # ##### ## ###### # #######  # #
### # ##    ##      # # #     #### #
#   #    #  #######   #   ###    #E#
####################################

1 个答案:

答案 0 :(得分:0)

现在,为了序言,我同意上面的评论讨论,不建议在没有参数的函数上在python中进行递归搜索,因为根据搜索的工作方式以及它如何访问{{1} }变量,你基本上会做一个迭代搜索,即#34;治理"通过一个函数,即它只是决定增量和何时增加。

要以您描述的方式正确地进行迭代搜索,您可以将global转换为包装函数:

要么(推荐):

findStart

或:     mazeList = ... #define mazeList     def findStart(mazeList):         return findStartRec(mazeList,0,0)

然后解决:

def findStart(mazeList):
    return findStartRec(mazeList,0,0)

适合我:

def findStartRec(mazeList,x,y):
    if y >= len(mazeList):
        return -1,-1                         # We have reached the end of the maze and no result
    if x >= len(mazeList[y]):
        return findStartRec(mazeList,0,y+1)  # We have reached the end of a row, continue to the next row
    if mazeLise[y][x] == "S":
        return x,y                           # We have found the start
    else:
        return findStartRec(mazeList,x+1,y)  # Search the next spot on this row

然后首先定义,没有参数函数:

>>> findStartRec(mazeList) 
(1, 1)

然后致电:

maze = """####################################
#S#  ##  ######## # #      #     # #
# #   #             # #        #   #
#   # ##### ## ###### # #######  # #
### # ##    ##      # # #     #### #
#   #    #  #######   #   ###    #E#
####################################"""
mazeList = [[x for x in row] for row in maze.split('\n')]
def findStart():
    return findStartRecu(mazeList,0,0)

作为最后一点,这并不是递归搜索的最佳应用,因为这种搜索存在于非常明确且已知的边界中,即它是矩形的。递归搜索更适合于树,链表等非线性形状的数据结构,因为不可能使用像>>> findStart() (1,1) 循环这样的有限映射来真正搜索它们。