下面的代码是一个巨大的问题:您在步数范围内为 每种 可能性扣除步数。
n=n-ires=CSR(n,i,res)
探索完您可以执行1步跳转后的操作后,您需要 回溯 并尝试从 同一 起点(此实例的原始值
n)进行2步跳转。将代码更改为:
res = CSR(n-i, i, res)
n当您遍历循环时,这将保持值不变。
此外,您不能将将来的跳跃次数限制在您刚尝试的最大值。也更改第二个参数:
res = CSR(n-i, k, res)
那应该让你感动。也可以尝试这个可爱的调试博客以获取帮助。至少插入一个或两个跟踪语句,例如
print n, k, res
在您的日常工作中
警告
这不是您的全部麻烦。剩下的最大问题是
CSR仅返回一种解决方案:您执行的每个步骤都将附加到 同一
列表中。您需要一种方法来将完整的解决方案收集为单独的列表。在
append中
climbingStaircase只执行一次,之后
CSR完全结束。
您需要在找到一个完整的解决方案
n==0。
调试帮助
这是程序的版本,其中固定了递归参数,并插入了调试跟踪。
indent = ""def climbingStaircase(n, k): final_res = [] final_res.append(CSR(n, k, [])) return final_resdef CSR(n, k, res): global indent indent += " " print indent, n, k, res if n == 0: print "SOLUTION", res else: for i in range(1, k+1): if n-i >= 0: CSR(n-i, k, res + [i]) indent = indent[:-2]print climbingStaircase(4, 2)
注意“缩进”的使用有助于可视化您的递归和回溯。这里的关键部分是
res,我没有将其全局更新,而是将其保留为局部变量。我现在还 删除
了返回值,只是转储以找到找到的解决方案。您可以看到它是如何工作的:
4 2 [] 3 2 [1] 2 2 [1, 1] 1 2 [1, 1, 1]0 2 [1, 1, 1, 1]SOLUTION [1, 1, 1, 1] 0 2 [1, 1, 2]SOLUTION [1, 1, 2] 1 2 [1, 2] 0 2 [1, 2, 1]SOLUTION [1, 2, 1] 2 2 [2] 1 2 [2, 1] 0 2 [2, 1, 1]SOLUTION [2, 1, 1] 0 2 [2, 2]SOLUTION [2, 2][None]
有了这些东西,我希望您能追踪您的逻辑并弄清楚如何在您选择的级别上捕获解决方案的顺序。



