递归列表更新错误 [网格中的机器人] Python
List Update Error in a Recursion [Robot in a Grid] Python
我正在做这本书中的问题:
网格中的机器人:想象一个机器人坐在 r 行 c 列的网格的左上角。机器人只能向右和向下两个方向移动,但某些单元格 "off limits" 使得机器人无法踩到它们。设计一个算法,为机器人寻找一条从左上角到右下角的路径。
我写了一个解决方案,但它不正确。
我在辅助函数中打印出了路径。一切都是正确的,但是当它返回 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()
问题出在这一行:
path = path[:-1]
此处赋值给path
,这是一个错误。你应该只改变 path
,而不是分配给它。当您分配时,调用者的 path
将不再受到影响——您现在已经创建了一个不同的列表引用。
因此,改用一种减小路径大小的方法
path.pop()
我正在做这本书中的问题:
网格中的机器人:想象一个机器人坐在 r 行 c 列的网格的左上角。机器人只能向右和向下两个方向移动,但某些单元格 "off limits" 使得机器人无法踩到它们。设计一个算法,为机器人寻找一条从左上角到右下角的路径。
我写了一个解决方案,但它不正确。
我在辅助函数中打印出了路径。一切都是正确的,但是当它返回 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()
问题出在这一行:
path = path[:-1]
此处赋值给path
,这是一个错误。你应该只改变 path
,而不是分配给它。当您分配时,调用者的 path
将不再受到影响——您现在已经创建了一个不同的列表引用。
因此,改用一种减小路径大小的方法
path.pop()