python中的递归与多维矩阵
这是一个著名的路径计算问题,我正试图用记忆来解决它。 开导我吧python中的递归与多维矩阵,python,recursion,memoization,Python,Recursion,Memoization,这是一个著名的路径计算问题,我正试图用记忆来解决它。 开导我吧 def pathCounter(a,b): matrix = [[0 for i in xrange(a)] for i in xrange(b)] if a==0 or b==0: return 1 if matrix[a][b]: return matrix[a][b] print matrix[a][b] matrix[a][b]=pathCount
def pathCounter(a,b):
matrix = [[0 for i in xrange(a)] for i in xrange(b)]
if a==0 or b==0:
return 1
if matrix[a][b]:
return matrix[a][b]
print matrix[a][b]
matrix[a][b]=pathCounter(a,b-1)+pathCounter(a-1,b)
return matrix[2][2]
if __name__=='__main__':
k=pathCounter(2,2)
print k
我相信你想解决这个问题。
如果是这样的话,那么使用递归进行求解是明智的,这是正确的
如果将网格的每个角想象成一个节点,那么您需要一个递归函数,该函数只需获取它所在节点的一个参数(x,y)
。在函数中,它首先需要检查调用它的位置是否是网格的右下角顶点。如果是,则函数将一个添加到路径计数
(路径到达此角时即完成),然后返回。否则,该函数只调用另外两个自身(这是递归),一个在其右侧(因此y+1
),另一个在其左侧(x+1
)。另外一个步骤是检查坐标在网格中,然后将它们称为底部行中间的一个节点,例如,不应该调用它下面的节点,因为它将离开网格。< /P>
现在定义了递归函数,现在只需声明一个变量来存储路径计数
。并从坐标(0,0
)调用递归函数
但是,正如您所看到的,此解决方案在合理的时间内无法完成,因此有必要使用memorization
-通过缓存节点来加快速度,这样就不会计算相同的路径段两次
如果像您所做的那样,我们从右下角一直到左上角工作,那么编码也会变得更简单。最后一件事是,如果您使用词典
,那么代码就会变得更清晰
最终的代码应该类似于:
cache = {}
def pathCounter(x, y):
if x == 0 or y == 0:
return 1
if (x,y) in cache:
return cache[(x,y)]
cache[(x,y)] = pathCounter(x, y-1) + pathCounter(x-1, y)
return cache[(x,y)]
print(pathCounter(2,2))
这将给出6
的预期结果
我让你来做20x20
网格。希望这有帮助 您在执行算法时犯了一些错误。如果您使用递归方法,则不必使用网格
,因为实际上您需要任何存储的数据。您只需要从当前位置返回两个可能的子路径-就这样!因此,您需要对代码的主要思想进行一些更改
我尽量保留您的原始代码,但仍能正常工作:
def pathCounterNaive(width, height, startX = 0, startY = 0):
if startX >= width or startY >= height:
return 0
if startX == width-1 and startY == height-1:
return 1
return pathCounter(width,height, startX+1, startY) + pathCounter(width,height, startX, startY+1)
slowK=pathCounterNaive(3,3)
print(slowK)
请记住,参数width
和height
表示顶点的数量,因此对于2x2
网格,这些参数不是2
,而是3
。因为这段代码使用的是纯递归,所以速度非常慢。如果你想使用记忆方法,你必须修改你的代码如下:
import numpy as np
def pathCounter(width, height):
grid = np.zeros((height+1, width+1))
def pathCounterInternal(x, y):
if x==0 or y==0:
return 1
grid[x, y] = pathCounterInternal(x,y-1)+pathCounterInternal(x-1,y)
return grid[x, y]
grid[width, height] = pathCounterInternal(width, height)
return grid[width, height]
k=pathCounter(2,2)
print(k)
在这里,您必须使用2
作为2x2
网格的参数来调用它。由于缓存了已计算的路径,此代码的速度要快得多。您的具体问题是什么?第15个问题。我只想用python来解决它,需要学习python中的递归和其他概念OP要求使用memorization
来解决它,这对于它在很短的时间内完成更大的网格大小是必要的。。。。