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

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)完整调用流程

  1. 调用change(34),34不在24~27的基准返回区间,执行coins = change(34-5=29),进入change(29)调用
  2. 调用change(29),29不在基准返回区间,执行coins = change(29-5=24),进入change(24)调用
  3. 调用change(24),匹配基准条件,直接返回列表[5,5,7,7]
  4. 回到change(29)执行逻辑:coins已拿到change(24)返回的列表,执行coins.append(5)后列表变为[5,5,7,7,5],返回该列表
  5. 回到change(34)执行逻辑:coins已拿到change(29)返回的列表,执行coins.append(5)后列表变为[5,5,7,7,5,5],返回该列表
  6. 最终print输出上述结果,与实际运行输出一致。

可选优化建议

如果需要避免可变对象的副作用,希望每层递归返回独立的新列表,可以将coins.append(5); return coins替换为return coins + [5],二者返回的结果值完全相同,区别仅在于是否修改原列表对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 02:30:02