这是著名的路径计数问题,我试图用记忆来解决它。 开导我!在
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
我相信你想解决this problem
如果是这样,那么您是正确的,它将是明智的解决递归。在
如果您将网格的每个角落想象为一个节点,那么您需要一个递归函数,它只需接受它所在节点的参数{}。在函数中,它首先需要检查调用它的位置是否是网格的右下角顶点。如果是,函数会将一个添加到
path count
(当路径到达这个角时,路径就结束了),然后返回。否则,这个函数只调用另外两个自身(这是递归),一个调用它的right
(soy+1
),另一个调用它的left
(x+1
)。另外一个步骤是检查坐标是否在网格中,然后将其作为最下面一行中间的节点调用,例如不应该调用它下面的节点,因为那样会脱离网格。在现在已经定义了递归函数,现在只需声明一个变量来存储
path count
。并从坐标(0,0
)调用递归函数。在但是,正如我确信您已经看到的,这个解决方案并没有在合理的时间内完成,所以您有必要使用
memoization
-通过缓存节点来加速它,这样相同的路径部分不会被计算两次。在如果像您所做的那样,我们从右下角向上到左上角工作,这也使编码变得更加简单。最后一件事是,如果使用
dictionary
,那么代码会变得更清晰。在最后的代码应该类似于:
这将得到
6
的预期结果。在我让你来做
20x20
网格。希望这有帮助!在你在算法的实现中犯了一些错误。如果使用递归方法,则不必使用
grid
,因为实际上您需要任何存储的数据。你只需要从当前位置返回两个可能的子路径-就这样!因此,您需要对代码的主要思想进行一些更改。在我尽量保留您的原始代码,但仍能正常工作:
请记住,参数
^{pr2}$width
和height
表示顶点的数目,因此对于2x2
网格,它们不是2
,而是3
。由于这段代码使用纯递归,所以速度非常慢。如果你想使用你的记忆方法,你必须修改你的代码如下:这里您必须使用
2
作为2x2
网格的参数来调用它。由于缓存了已计算的路径,此代码要快得多。在相关问题 更多 >
编程相关推荐