【发布时间】:2016-09-20 22:00:24
【问题描述】:
我正在解决的问题是,来自 Cracking the Coding Interview:
“一个孩子正在跑上 n 步的楼梯,可以跳 1 步,2 步, 或一次 3 个步骤。实现一个方法来计算有多少种可能的方式 孩子可以跑上楼梯。”
来自 C++ 我知道计数器可以作为引用传递,但在 python 中你不能。我也在尝试跟踪导致成功的步骤顺序。我正在编写这样的代码:
def __calculatePaths(currPathLength, paths, currSeries):
if currPathLength == 0:
print "successful series is", currSeries
return 1
elif currPathLength < 0: return 0
for i in range(1, 4):
newSeries = list(currSeries) # make new series to track steps
newSeries.append(i)
paths += __calculatePaths(currPathLength - i, paths, newSeries)
return paths
def calculatePaths(pathLength):
paths = __calculatePaths(pathLength, 0, [])
return paths
if __name__ == '__main__':
calculatePaths(3)
这个调用的输出是:
successful series is [1, 1, 1]
successful series is [1, 2]
successful series is [2, 1]
successful series is [3]
6
我很困惑,因为我的程序获得了正确的路径序列,但路径数量错误。我应该如何增加我的路径?我知道如何在没有全局变量的情况下执行此操作,但如果不使用全局变量我无法弄清楚。谢谢!
【问题讨论】:
-
你能用数学吗,还是必须是蛮力?
-
蛮力解决方案将最适用于其他递归问题(因为我无法理解在递归问题中使用计数器的一般原则)
-
在 Python 中,如果将计数器设为容器(如列表)并将其作为参数传递,则实际上是通过引用传递它。另外,如果你要编写 Python 代码,我强烈建议你关注PEP 8 - Style Guide for Python Code。