Python 在这个递归回溯函数中,我应该在哪里返回值?

Python 在这个递归回溯函数中,我应该在哪里返回值?,python,recursion,recursive-backtracking,Python,Recursion,Recursive Backtracking,处理以下编码面试问题: 一位城市规划师想要规划她的城市,使公园靠近人们的家。给定一个代表城市的N×N矩阵,其中每个坐标可以是“H”(家)、“W”(水)或“E”(空),在城市的空部分放置K个公园,“P”,以便它们靠近人们的家。具体来说,尽量减少从人们家到最近公园的曼哈顿距离之和。人们不能游过水面 我试图写一个函数来帮助解决这个问题,给定网格,一个点,已经尝试的点,已经行驶的距离,以及到目前为止发现的最小距离,可以递归地找到到任何公园的最短路径。查看print语句的输出,函数似乎正确地找到了公园的所

处理以下编码面试问题:

一位城市规划师想要规划她的城市,使公园靠近人们的家。给定一个代表城市的N×N矩阵,其中每个坐标可以是“H”(家)、“W”(水)或“E”(空),在城市的空部分放置K个公园,“P”,以便它们靠近人们的家。具体来说,尽量减少从人们家到最近公园的曼哈顿距离之和。人们不能游过水面

我试图写一个函数来帮助解决这个问题,给定网格,一个点,已经尝试的点,已经行驶的距离,以及到目前为止发现的最小距离,可以递归地找到到任何公园的最短路径。查看
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