Python仅用5和7面值硬币找零递归代码中append执行顺序疑问
递归找零代码执行逻辑解答
def change(amount): assert amount>=24, "Only amount>=24 is allowed" if amount == 24: return [5, 5, 7, 7] if amount == 25: return [5, 5, 5, 5, 5] if amount == 26: return [5, 7, 7, 7] if amount == 27: return [5, 5, 5, 5, 7] coins= change(amount-5) coins.append(5) return coins print(change(34))
执行顺序核心说明
coins.append(5)不会在递归调用change(amount-5)之前执行。Python严格按代码行顺序执行,赋值语句coins = change(amount-5)必须等右侧递归调用完全执行完成、拿到返回值后,才会完成对coins的赋值,之后才会执行下一行的append操作。- 5会追加到
change(24)返回的列表末尾,是因为Python中列表属于可变对象,多层递归传递的是同一个列表的引用,每层的append都是直接修改该列表本身,而非生成新列表。
change(34)完整调用流程
- 调用
change(34),34不在24~27的基准返回区间,执行coins = change(34-5=29),进入change(29)调用 - 调用
change(29),29不在基准返回区间,执行coins = change(29-5=24),进入change(24)调用 - 调用
change(24),匹配基准条件,直接返回列表[5,5,7,7] - 回到
change(29)执行逻辑:coins已拿到change(24)返回的列表,执行coins.append(5)后列表变为[5,5,7,7,5],返回该列表 - 回到
change(34)执行逻辑:coins已拿到change(29)返回的列表,执行coins.append(5)后列表变为[5,5,7,7,5,5],返回该列表 - 最终
print输出上述结果,与实际运行输出一致。
可选优化建议
如果需要避免可变对象的副作用,希望每层递归返回独立的新列表,可以将coins.append(5); return coins替换为return coins + [5],二者返回的结果值完全相同,区别仅在于是否修改原列表对象。
内容的提问来源于stack exchange,提问作者Nakkhatra
相关产品推荐
相关产品推荐

