如何在Python递归期间使用共享变量
我正在实现一个基于回溯的递归解决方案,并希望根据条件更新变量min_path。如果我在递归函数之外定义变量,我会得到一个引用错误,那么实现这种解决方案的最佳方法是什么如何在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
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方法,对于属于类对象成员的函数不可用。为了在回溯方法中引用它,您需要
可能得玩一会儿。我没有输入数据,所以我没有运行代码。但这些就是你实施我提供的解决方案的方法 因为目标是简单地找到最小和,所以不需要跟踪路径的坐标。相反,您可以从正在执行的步骤的角度,使用网格的剩余部分进行递归调用:
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]
])