递归爬楼梯问题: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
相关产品推荐
相关产品推荐

