我正在实现一个基于回溯的递归解决方案,并想根据条件更新变量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

供参考,这是我要解决的问题: https : //leetcode.com/problems/minimum-path-sum/

#1楼 票数:0

您的变量min_path的作用域为main方法,不适用于属于您的类对象的函数。 为了在backtrack方法中引用它,您要么需要

  1. 将min_path定义为backtrack方法中的局部变量(由于递归调用它可能会引起其他问题):
class Solution:
def minPathSum(self, grid: List[List[int]]) -> int:
    if not grid:
        return

    R = len(grid)
    C = len(grid)
    min_path_main = None

    min_path_main = backtrack(grid, 0, 0,0)

    return min_path_main

  def backtrack(grid, i, j, current_path):
    min_path = None
    if i >= R or j>= C:
        break
      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)
            break
    # it's possible you'll need extra logic here to manage the output. 
    output1 = backtrack(grid, i, j+1, current_path)
    output2 = backtrack(grid, i+1, j, current_path)

  return min_path
  1. 将变量定义为类变量:
class Solution:
def __init__(self):
  self.min_path = None

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

    R = len(grid)
    C = len(grid)

    backtrack(grid, 0, 0,0)

    return self.min_path

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

  return

可能需要玩一点。 我没有输入数据,所以没有运行代码。 但是这些就是您实施我提供的解决方案的方式。

#2楼 票数:0

由于目标是简单地找到最小和,因此无需跟踪路径的坐标。 相反,您可以从要执行的步骤的角度使用网格剩余的内容进行递归调用:

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

  ask by user3655266 translate from so

未解决问题?本站智能推荐:

2回复

使用递归回溯生成集合的所有子集(Python)

我试图理解回溯,但我遇到了这个问题,这是提示: 给定一组不同的整数,返回所有可能的子集。 输入示例: [1,2,3] 输出示例: [[], [1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3]] 这是我的代码: 当我返回
3回复

递归回溯-python。 不返回价值

问题 我知道在函数的某个地方,我没有返回应有的东西。 我正在返回递归调用,但似乎没有返回“全部” 语境 我正在对列表中的每个单个组合进行深度优先搜索。 一旦达到条件的组合,我想返回。 我正在维持合并的“状态”,并回溯到应该的位置(我认为)。 我究竟做错了什么
1回复

我如何计算 Python 中递归函数的迭代次数?

鉴于上面的代码,我将如何实现一个计数器来计算函数的递归部分进行了多少次迭代? 从代码中可以看出,我尝试了上述操作,但无法检索此变量以将其打印出来并记录数字。
2回复

使用 Python 的“汉密尔顿”路径

我正在尝试实现对使用 Python 遍历所有图顶点的任意路径(不一定是循环)的递归搜索。 这是我的代码: 这里, pt是起点, path是所有先前遍历的顶点的列表,不包括pt ,默认为空。 问题是,无论何时找到这样的路径,return 语句都会引用该过程的某个内部调用,因此程序不会终止或返回该路
4回复

如何收集递归回溯的结果?

我正在自学递归回溯。 对于骰子求和问题,我无法弄清楚如何优雅地收集结果。 供参考,这是我的代码,它仅打印符合条件的任何骰子。 理想情况下,我想更改它,这样就可以打印那些骰子的列表并返回它,而不是打印输出。 下面是不执行我想要的代码 def dice_sum(num_dice:
1回复

在递归迷宫中回溯; Python

我正在编写一个迷宫求解算法,一旦你撞到“墙”,我就会遇到回溯问题 到目前为止,我的代码检查了一些基本的递归情况,例如是否已到达终点或是否已检查所有点。 我也做了它,以便有一个列表来跟踪解决方案“路径”并相应地添加和删除点。 因此,每次添加一个点时,它都会检查其是否有效并检查该点的上方、左侧、右侧和下
1回复

递归回溯没有返回值python

完整的问题在https://www.hackerrank.com/challenges/password-cracker/我想知道我的递归回溯实现有什么问题 问题:给定一组密码,如果单词不是这些密码的组合,则返回“错误的密码” 我想问一下我如何从中返回一个值; 我可以打印解决方案,但不能以字符串形
1回复

无法使用回溯获得数独求解器的输出

我开始使用回溯和递归来研究数独求解器。 我无法打印已解决的数独。 我已经测试了possible(y,x,n)方法并且它有效。 程序以Process finished with exit code 0但没有打印出已解决的数独谜题。 我使用 python 3.7 和 PyCharm 社区版 2020.1