如何在Python递归期间使用共享变量

如何在Python递归期间使用共享变量,python,recursion,recursive-backtracking,Python,Recursion,Recursive Backtracking,我正在实现一个基于回溯的递归解决方案,并希望根据条件更新变量min_path。如果我在递归函数之外定义变量,我会得到一个引用错误,那么实现这种解决方案的最佳方法是什么 class Solution: def minPathSum(self, grid: List[List[int]]) -> int: if not grid: return R = len(grid) C = len(grid[0]) min_path = None

我正在实现一个基于回溯的递归解决方案,并希望根据条件更新变量min_path。如果我在递归函数之外定义变量,我会得到一个引用错误,那么实现这种解决方案的最佳方法是什么

class Solution:
def minPathSum(self, grid: List[List[int]]) -> int:
    if not grid:
        return


    R = len(grid)
    C = len(grid[0])
    min_path = None

    def backtrack(grid, i, j, current_path):

        if i >= R or j>= C:
            return
        current_path += grid[i][j]
        if i == R-1 and j == C-1:
            if not min_path:
                min_path = current_path
            else:
                min_path = min(min_path, current_path)
            print(min_path)
            return
        backtrack(grid, i, j+1, current_path)
        backtrack(grid, i+1, j, current_path)

    backtrack(grid, 0, 0,0)

    return min_path

作为参考,这是我试图解决的问题:

您的变量min\u path的作用域是main方法,对于属于类对象成员的函数不可用。为了在回溯方法中引用它,您需要

  • 将min_path定义为回溯方法中的局部变量(这可能会导致其他问题,因为您以递归方式调用它):
  • 将变量定义为类变量:

  • 可能得玩一会儿。我没有输入数据,所以我没有运行代码。但这些就是你实施我提供的解决方案的方法

    因为目标是简单地找到最小和,所以不需要跟踪路径的坐标。相反,您可以从正在执行的步骤的角度,使用网格的剩余部分进行递归调用:

    def min_sum(g):
        if not g or not g[0]:
            return float('inf')
        return g[0][0] + ((len(g) > 1 or len(g[0]) > 1) and min(map(min_sum, (g[1:], [*zip(*g)][1:]))))
    
    以便:

    min_sum([
      [1,3,1],
      [1,5,1],
      [4,2,1]
    ])
    

    返回:
    7

    非局部最小路径
    添加到内部函数。谢谢!这很有效。这对我们来说是一个很好的实践吗?非局部的设计正是为了这种用途。非局部与全局相似,但用于闭包
    def min_sum(g):
        if not g or not g[0]:
            return float('inf')
        return g[0][0] + ((len(g) > 1 or len(g[0]) > 1) and min(map(min_sum, (g[1:], [*zip(*g)][1:]))))
    
    min_sum([
      [1,3,1],
      [1,5,1],
      [4,2,1]
    ])