
本文详解如何用循环和指数运算解决经典复利比较问题:对比一次性获得100万美元与从1美分起每日翻倍持续30天的最终收益,并提供可运行代码、逻辑解析与常见误区提醒。
本文详解如何用循环和指数运算解决经典复利比较问题:对比一次性获得100万美元与从1美分起每日翻倍持续30天的最终收益,并提供可运行代码、逻辑解析与常见误区提醒。
在编程入门中,“每日翻倍”问题是一个极佳的实践案例,它直观展示了指数增长的惊人力量,也考验对循环结构、变量更新和浮点数精度的理解。核心目标是:计算第30天结束时,初始0.01美元(1美分)连续每日翻倍后的累计金额,并与1,000,000美元直接比较。
正确的实现应体现“累积翻倍”过程——即第1天为0.01,第2天为0.02,第3天为0.04……第n天为 0.01 × 2^(n−1)。以下为推荐解法:
# 方法1:使用for循环逐日翻倍(推荐初学者理解逻辑)
start = 0.01
amount = start
for day in range(1, 31): # day从1到30(含),共30次迭代
if day == 1:
continue # 第1天金额即为初始值0.01,无需翻倍
amount *= 2 # 每次循环将当前金额乘以2
print(f"第30天总金额: ${amount:,.2f}")更简洁且符合数学本质的写法是直接使用幂运算:
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
# 方法2:一行公式计算(本质等价,更高效)
days = 30
initial = 0.01
final_amount = initial * (2 ** (days - 1)) # 第1天是2⁰倍,第30天是2²⁹倍
print(f"第30天总金额: ${final_amount:,.2f}") # 输出:$5,368,709.12⚠️ 注意事项:
立即学习“Python免费学习笔记(深入)”;
- 原提问中的 for i in range(31) 循环了31次(0–30),且错误地将i(索引)当作金额参与计算(如 day * (2 ** 2)),导致逻辑完全偏离;
- 浮点数在金融计算中可能存在微小精度误差,本例因数值不大可忽略,但生产环境建议使用 decimal.Decimal;
- 翻倍是累计效应:不是每天额外加一个翻倍量,而是当前总额整体×2,因此必须用 amount *= 2 而非 amount = amount + amount(虽结果相同,但前者语义更清晰)。
最终结果远超直觉:约536.87万美元 > 100万美元——这正是指数增长的典型启示。掌握此类问题,不仅巩固了循环与幂运算,更培养了对算法规模的敏感度。

















