# 定义总的楼梯步数 n = 7 # 用于记录每一种走法中每次走的步数情况,初始为空列表,会在递归过程中动态添加和移除元素 x = [] # 初始化一个空列表X X = [] def conflict(k): """ 判断当前探索的走法是否产生冲突(不符合要求的情况)。 :param k: 当前已经走过的步数索引(从0开始计数)。 :return: 如果当前记录的步数总和超过了目标步数n,则返回True,表示有冲突;否则返回False,表示无冲突。 """ global n, x, X # 计算当前已经记录在x列表中的前k + 1个元素的总和,也就是当前已经走过的步数总和 current_sum = sum(x[:k + 1]) # 将这个总和与目标步数n进行比较,如果超过了目标步数n,说明按照当前走法已经走过头了,不符合要求,返回True if current_sum > n: return True # 如果总和没有超过n,说明当前走法暂时是符合要求的,返回False return False def climb_stairs(k): """ 通过深度优先搜索的方式来递归探索所有可能的爬楼梯走法组合,以达到目标步数n。 :param k: 当前已经走过的步数索引(从0开始计数),用于记录当前走法探索的进度以及辅助判断等。 """ global n, x, X # 递归终止条件:当当前记录在x列表中的步数总和已经等于目标步数n时,说明找到了一种满足条件的走法 if sum(x) == n: print(x) else: # 尝试每次可以走的步数选择,这里限定为1步或者2步 for i in [1, 2]: # 将选择的步数添加到x列表中,模拟走了这一步 x.append(i) # 调用conflict函数来检查这样走是否会导致走过头(产生冲突) if not conflict(k): # 如果没有冲突,就继续递归调用climb_stairs函数,进入下一层的搜索,去尝试后续的步数选择,此时步数索引k加1 climb_stairs(k + 1) # 如果有冲突,那么需要把刚刚添加的步数从x列表中移除,然后回到上一层继续尝试其他的步数选择情况 x.pop() # 启动整个爬楼梯问题的求解过程,从步数索引为0的最开始情况逐步递归探索所有可能的走法组合 climb_stairs(0) 返回结果: