下面的代码中存在一个大问题:您在步长范围内为每种可能性减去步数。
n=n-i
res=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
inclimbingStaircase
只执行一次,after完全CSR
完成。
您需要在n==0
.
调试帮助
这是您的程序的一个版本,其中递归参数固定,并插入了调试跟踪。
indent = ""
def climbingStaircase(n, k):
final_res = []
final_res.append(CSR(n, k, []))
return final_res
def 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]
有了这些东西,我希望您可以跟踪您的逻辑并弄清楚如何在您选择的级别上捕获解决方案的序列。