单跳最多回溯n个楼梯n步

Aer*_*rin 1 algorithm recursion backtracking recursive-backtracking

您需要爬上n个台阶的楼梯,然后决定跳上台阶进行一些额外的锻炼。一次跳转最多可以覆盖k个步骤。返回您可能要爬上楼梯的所有可能跳序列,已排序。

我的实现显然给了我错误的答案。

def climbingStaircase(n, k):
    final_res=[]
    final_res.append(CSR(n,k,[]))
    return final_res

def CSR(n,k,res):
    if n == 0:
        return res        
    else:
        for i in range(1,k+1):
            if n-i>=0:
                res.append(i)
                n=n-i
                res=CSR(n,i,res)
        return res
Run Code Online (Sandbox Code Playgroud)

对于n = 4和k = 2,输出应为

[[1, 1, 1, 1],
 [1, 1, 2],
 [1, 2, 1],
 [2, 1, 1],
 [2, 2]]
Run Code Online (Sandbox Code Playgroud)

实际输出:

[[1,1,1,1,2,1]]
Run Code Online (Sandbox Code Playgroud)

有人可以指出我缺少的那一部分吗?

Pru*_*une 5

下面的代码是一个巨大的问题:您在步数范围内为每种可能性扣除步数。

n=n-i
res=CSR(n,i,res)
Run Code Online (Sandbox Code Playgroud)

探索完您可以执行1步跳转后的操作后,您需要回溯并尝试从同一起点(此实例的原始值n)进行2步跳转。将代码更改为:

res = CSR(n-i, i, res)
Run Code Online (Sandbox Code Playgroud)

这使 n当您遍历循环时,值不变。

此外,您不能将将来的跳跃次数限制在您刚尝试的最大值。也更改第二个参数:

res = CSR(n-i, k, res)
Run Code Online (Sandbox Code Playgroud)

那应该让你感动。也可以尝试这个可爱的调试博客以获取帮助。至少插入一个或两个跟踪语句,例如

print n, k, res
Run Code Online (Sandbox Code Playgroud)

在您的日常工作中

警告

这不是您的全部麻烦。剩下的最大问题是CSR仅返回一种解决方案:您执行的每个步骤都将附加到同一列表中。您需要一种方法来将完整的解决方案收集为单独的列表。在appendclimbingStaircase只执行一次,之后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)
Run Code Online (Sandbox Code Playgroud)

注意“缩进”的使用有助于可视化您的递归和回溯。这里的关键部分是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]
Run Code Online (Sandbox Code Playgroud)

有了这些东西,我希望您能追踪您的逻辑并弄清楚如何在您选择的级别上捕获解决方案的顺序。