You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

递归爬楼梯问题:Python代码为何无法正确运行?

爬楼梯递归路径输出错误的原因分析

核心问题:可变列表的共享修改与递归无回溯

你的代码无法正确运行主要有两个关键原因:

  • 递归中直接修改原列表,未做回溯:你用a.append(1)和a.append(2)直接修改了传入的列表对象,递归调用返回后,这个列表的状态已经被改变。后续的递归分支会在这个被修改过的列表上继续操作,导致所有路径的元素互相叠加,最终输出的是不断累加的混乱结果。比如走完[1,1,1]路径后,列表变成[1,1,1],返回后处理[1,2]分支时,会在这个基础上再append(2),得到错误的[1,1,1,2]。

  • 可变默认参数的潜在陷阱:Python中函数的默认可变参数(比如这里的a=[])是在函数定义时创建的,而非每次调用时。虽然你调用时手动传了[]避开了这个问题,但如果后续省略第二个参数调用,会复用同一个默认列表,导致更隐蔽的错误。

正确解决思路:传递新列表而非修改原列表

你后续改成传递a+[1]和a+[2]是完全正确的,因为a+[1]会创建一个新的列表,原列表a不会被修改。每个递归分支都使用独立的列表,路径之间不会互相干扰,自然能输出正确的结果。

修复后的示例代码:

def waysToClimb(n, a=None):
    # 避免可变默认参数的陷阱
    if a is None:
        a = []
    if n == 0:
        print(a)
        return
    if n >= 1:
        waysToClimb(n-1, a + [1])
    if n >= 2:
        waysToClimb(n-2, a + [2])

调用waysToClimb(3)会输出预期结果:

[1, 1, 1]
[1, 2]
[2, 1]

内容的提问来源于stack exchange,提问作者BlueInundation

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 03:00:57