递归[网格中的机器人] Python中的列表更新错误

时间:2019-07-14 19:25:16

标签: python algorithm recursion depth-first-search

我正在从一本书中回答这个问题:

网格中的机器人:想象一个机器人坐在网格的左上角,其中有r行和c列。机器人只能在左右两个方向上移动,但是某些单元格处于“禁区”,因此机器人无法踩踏它们。设计一种算法,以从左上角到右下角找到机器人的路径。

我为此写了一个解决方案,但这是不正确的。

我打印出了辅助函数中的路径。都正确,但是当它返回path_through_grid()函数时,它更改为其他内容。我不知道这里发生了什么。请帮忙〜

以下是我编写的代码:

def path_through_grid(grid):
  path = ["start"]
  helper(grid, 0, 0, path)
  print("final", path)
  if path[-1]=='end':
    return path
  else:
    return None

def helper(grid, r, c, path):
  print("start---", r, " - ", c, "path: ", path)
  if r == len(grid) or c == len(grid[0]):
    return
  if grid[r][c] == 1:
    return
  if r == len(grid)-1 and c == len(grid[0])-1:
    print("inside")
    path.append("end")
    return
  path.append("right")
  helper(grid, r, c+1, path)
  print("middle---", r, " - ", c, "path: ", path)
  if path[-1]=="end":
    print("inside 2", path)
    return
  path = path[:-1]
  print("after", path)
  path.append("down")
  helper(grid, r+1, c, path)
  print("end---", r, " - ", c, "path: ", path)

import unittest

class Test(unittest.TestCase):
  def test_path_through_grid(self):
    grid = [[0,1],
            [0,0]]
    self.assertEqual(path_through_grid(grid), ["start", "down", "right", "end"])

if __name__ == "__main__":
  unittest.main()

1 个答案:

答案 0 :(得分:1)

问题是这一行:

path = path[:-1]

在这里您分配给path,这是一个错误。您只应更改path,而不要对其进行分配。分配后,呼叫者的path将不再受到影响-您现在创建了一个不同的列表引用。

因此,请使用一种减小路径大小的方法

path.pop()