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
来解决它,这对于它在很短的时间内完成更大的网格大小是必要的。。。。