繁体   English   中英

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

How to use a shared variable during Recursion in Python

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

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

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/

2 个回复

您的变量 min_path 的范围仅限于 main 方法,并且不适用于作为 class object 成员的函数。 为了在回溯方法中引用它,您要么需要

  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 变量:
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

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

由于目标是简单地找到最小和,因此无需跟踪路径的坐标。 您可以从您正在采取的步骤的角度使用网格的剩余部分进行递归调用:

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

1 Python递归期间的内存使用

我已经实现了一个递归函数,该函数将一个numpy数组作为参数。 这里是简化版: 在每个递归调用中,我都使用由某些索引索引的数组的一部分。 我的问题是关于内存负载的:python如何处理呢? 是否在每次调用时复制数组? ...

3 Python递归期间的变量范围错误

以下代码在构建HTML输出字符串时将字典列表递归处理到树中。 尝试从递归函数内部访问output字符串变量时,出现范围访问错误。 但是,在相同范围内访问nodes列表对象没有问题-实际上,在添加output var之前,该函数运行良好。 怎么了 样本: http : //ideone ...

4 如何在python中使用递归

我试图解决刺激机器人运动的问题。 机器人从位置(0,0,'N')开始。 该命令在字符串列表中给出。 'turn'功能从N变为E,S变为W并返回N.移动功能沿特定方向移动:Y轴为N,S轴为E轴,E为W轴。 N:y + 1 S:y-1 W:x-1 E:x + 1 我遇到问题的部分是,当 ...

5 如何在递归中使用索引变量?

我想在递归中使用索引变量,而不在调用函数时将其作为参数发送。 但是,如果我在一开始将其重置(例如i = 0),它将在每次运行时重置。 我想将其用作计数器(对功能运行进行计数)。 ...

6 递归期间的全局变量

我有一个全局变量masterList,它是一个HashMap。 我有一个递归函数generateAnagram,该函数将字谜的ArrayLists放入此HashMap中,并将列表中的单词数作为值。 但是,第一次调用后,HashMap开始混乱,并且先前的ArrayList被我尝试添加的 ...

7 如何在python中递归期间保持状态

我正在尝试在 python 中为井字游戏实现一个简单的最小最大算法我有以下方法的问题: 该方法采用以下参数: 因此,鉴于这样的董事会,应该有 255168 种可能的结果,因此我希望我的积分列表包含 255168 个 1,0,-1 的值,但我所拥有的只是: 理想情况下,我想为 for 循环 ...

8 如何创建和使用共享 memory 项的两个 Python 迭代,并在使用过程中维护共享 memory?

如何创建一对包含相同项目的可迭代对象(不仅仅是副本,而是共享项目的 memory)但顺序不同,并且对其中一个可迭代对象中的项目的更改将反映在另一个可迭代对象中? 例如: 到目前为止很好,但是如果我对可迭代项中的一个项目进行更改,它最终会创建一个新项目(新内存)空间,而不是更改同一 memory 空 ...

9 在python中使用递归来组合可变大小的列表

我有一个问题,随着问题的发展,这有点麻烦。 情况: 我需要将大小可变的列表中的项目与大小可变的元素进行组合,存储这些组合,然后对其进行遍历。 我尝试过itertools,但是得到的组合太多,我不知道如何正确地进行“清洁”。 通过创建与输入列表中“ op”元素数量一样多的for循环 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM