算法--解决“爬楼梯”问题

# 定义总的楼梯步数
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)


返回结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luky!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值