递归到迭代DFS-python

递归到迭代DFS-python,python,recursion,iteration,depth-first-search,Python,Recursion,Iteration,Depth First Search,我正在尝试将递归代码转换为迭代代码。任务是找到由网格中的单元组成的最大区域连接单元 代码在此引用: 我曾尝试使用堆栈和循环来替换递归,但它不起作用 这是我尝试过的代码,它不会再现与递归方法相同的结果 我试过了 M = np.array([[0, 0, 1, 1, 0], [1, 0, 1, 1, 0], [0, 1, 0, 0, 0], [0, 0, 0, 0, 2],[0, 0, 0, 1, 0],[0, 0, 3, 0, 0]]) def DFS(M, row, col, visited

我正在尝试将递归代码转换为迭代代码。任务是找到由网格中的单元组成的最大区域连接单元

代码在此引用: 我曾尝试使用堆栈和循环来替换递归,但它不起作用

这是我尝试过的代码,它不会再现与递归方法相同的结果

我试过了

M = np.array([[0, 0, 1, 1, 0], [1, 0, 1, 1, 0], [0, 1, 0, 0, 0], [0, 0, 0, 0, 2],[0, 0, 0, 1, 0],[0, 0, 3, 0, 0]]) 

def DFS(M, row, col, visited): 
    rowNbr = [-1, -1, -1, 0, 0, 1, 1, 1]  
    colNbr = [-1, 0, 1, -1, 1, -1, 0, 1]  

    # Mark this cell as visited  
    visited[row][col] = True
    stack = [] 

    for k in range(8): 
        if (isSafe(M, row + rowNbr[k],  
                   col + colNbr[k], visited)): 

            stack.push(M[row][col])
            row = row + rowNbr[k]
            col = col + colNbr[k]
            for k in range(8): 
                if (isSafe(M, row + rowNbr[k],  
                    col + colNbr[k], visited)):
                    stack.push(M[row][col])

使用堆栈的DFS的一般结构是

堆栈=[]初始化堆栈 visited=设置初始化哈希表以查看访问的节点 stack.appendstartNode放在开始节点中 而lenstack!=0:检查待办事项列表中是否有任何内容 newNode=stack.pop获取要访问的下一个节点 如果未访问新节点:如果未访问此节点,则更新已访问 已访问。addnewNode 对于newNode中的邻居。邻居:迭代邻居 如果邻居未被访问:检查邻居是否被访问 stack.appendneighbor以前未看到此节点,请将其添加到待办事项列表中 在您的例子中,您似乎没有使迭代次数取决于堆栈中是否还有元素,也没有从堆栈中获取下一个要访问的元素,因为您没有从中取出任何元素

您可以尝试以下方法:

def DFSM,行,列,已访问: rowNbr=[-1,-1,0,0,1,1,1] colNbr=[-1,0,1,-1,1,-1,0,1] 初始化堆栈 堆栈=[] stack.appendrow,col 而lenstack!=0: 行,列=stack.pop 如果未访问[行,列]: 已访问[行,列]=1 迭代邻居 对于范围8中的k: 如果isSafeM,row+rowNbr[k],col+colNbr[k],访问: 行=行+行编号[k] col=col+colNbr[k] 如果未访问[行,列]: stack.appendrow,col
这使用一个行、列的元组来标记位置并将它们存储在堆栈上。

您是否可以添加您的试用代码,并指定您所说的“不起作用”是什么意思?我已经编辑了我的问题以包含代码