Python 在这个递归回溯函数中,我应该在哪里返回值?
处理以下编码面试问题: 一位城市规划师想要规划她的城市,使公园靠近人们的家。给定一个代表城市的N×N矩阵,其中每个坐标可以是“H”(家)、“W”(水)或“E”(空),在城市的空部分放置K个公园,“P”,以便它们靠近人们的家。具体来说,尽量减少从人们家到最近公园的曼哈顿距离之和。人们不能游过水面 我试图写一个函数来帮助解决这个问题,给定网格,一个点,已经尝试的点,已经行驶的距离,以及到目前为止发现的最小距离,可以递归地找到到任何公园的最短路径。查看Python 在这个递归回溯函数中,我应该在哪里返回值?,python,recursion,recursive-backtracking,Python,Recursion,Recursive Backtracking,处理以下编码面试问题: 一位城市规划师想要规划她的城市,使公园靠近人们的家。给定一个代表城市的N×N矩阵,其中每个坐标可以是“H”(家)、“W”(水)或“E”(空),在城市的空部分放置K个公园,“P”,以便它们靠近人们的家。具体来说,尽量减少从人们家到最近公园的曼哈顿距离之和。人们不能游过水面 我试图写一个函数来帮助解决这个问题,给定网格,一个点,已经尝试的点,已经行驶的距离,以及到目前为止发现的最小距离,可以递归地找到到任何公园的最短路径。查看print语句的输出,函数似乎正确地找到了公园的所
print
语句的输出,函数似乎正确地找到了公园的所有可能路径。但是,我正在为如何返回最小距离而挣扎。如果我在isPark
块中返回mindist
,则函数会以某种方式返回None
,即使它正在打印正确的距离
def mdist2P(self, p, traversed, dist, mindist):
try:
if self.isPark(p):
print('found a park')
if dist <= mindist:
mindist = dist
print(mindist)
return mindist
else:
traversed.append(p)
print('traversing:')
pp.pprint(traversed)
if self.isValid([p[0]+1,p[1]],traversed):
print('traversing South')
self.mdist2P([p[0]+1,p[1]],traversed,dist+1,mindist)
if self.isValid([p[0],p[1]+1],traversed):
print('traversing East')
self.mdist2P([p[0],p[1]+1],traversed,dist+1,mindist)
if self.isValid([p[0]-1,p[1]],traversed):
print('traversing North')
self.mdist2P([p[0]-1,p[1]],traversed,dist+1,mindist)
if self.isValid([p[0],p[1]-1],traversed):
print('traversing West')
self.mdist2P([p[0],p[1]-1],traversed,dist+1,mindist)
#return mindist
except:
print('mdist input error')
这是输出:
traversing:
[[0, 0]]
traversing South
found a park
1
traversing East
traversing:
[[0, 0], [0, 1]]
traversing South
traversing:
[[0, 0], [0, 1], [1, 1]]
traversing East
traversing:
[[0, 0], [0, 1], [1, 1], [1, 2]]
traversing South
traversing:
[[0, 0], [0, 1], [1, 1], [1, 2], [2, 2]]
traversing North
traversing:
[[0, 0], [0, 1], [1, 1], [1, 2], [2, 2], [0, 2]]
traversing West
found a park
3
None
您没有对递归返回的值执行任何操作。例如,如果此调用
self.mdist2P([p[0]+1,p[1]],traversed,dist+1,mindsist)
正在返回某些内容,则不会捕获返回值。这里没有足够的示例,但我想,向这些递归调用添加return
至少可以帮助您进行调试。
traversing:
[[0, 0]]
traversing South
found a park
1
traversing East
traversing:
[[0, 0], [0, 1]]
traversing South
traversing:
[[0, 0], [0, 1], [1, 1]]
traversing East
traversing:
[[0, 0], [0, 1], [1, 1], [1, 2]]
traversing South
traversing:
[[0, 0], [0, 1], [1, 1], [1, 2], [2, 2]]
traversing North
traversing:
[[0, 0], [0, 1], [1, 1], [1, 2], [2, 2], [0, 2]]
traversing West
found a park
3
None