8. 递推与累加
猴子吃桃问题(逆向递推)
猴子第一天摘了若干桃子,每天吃一半多一个。第 10 天只剩 1 个。求第一天摘了多少?
思路:从第 10 天倒推。第 n 天的桃子数 = (第 n+1 天的桃子数 + 1) × 2。
python
p = 1 # 第 10 天只剩 1 个
for i in range(9, 0, -1): # 从第 9 天倒推到第 1 天
p = (p + 1) * 2
print(f'第{i}天还剩下{p}个桃子')
print(f'第一天一共摘了{p}个桃子') # 1534
▶ 运行结果:
输出
第9天还剩下4个桃子
第8天还剩下10个桃子
第7天还剩下22个桃子
第6天还剩下46个桃子
第5天还剩下94个桃子
第4天还剩下190个桃子
第3天还剩下382个桃子
第2天还剩下766个桃子
第1天还剩下1534个桃子
第一天一共摘了1534个桃子
舍罕王的失算(指数增长)
国际象棋棋盘 64 格,第 1 格放 1 粒麦子,第 2 格放 2 粒,第 3 格放 4 粒……每格翻倍。求总共需要多少粒麦子?
python
s = 0
for i in range(1, 65):
s += 2 ** (i - 1)
print(f"国王总共需要赏赐:{s} 粒麦子")
# 18446744073709551615 粒,约 92 万亿吨!
▶ 运行结果:
输出
国王总共需要赏赐:18446744073709551615 粒麦子
💡 指数爆炸
结果约 1.8×10¹⁹ 粒,按每粒 0.05 克计算,约 92 万亿吨——远超全球小麦年产量(约 7.7 亿吨)。这就是指数增长的威力。
多项式求和
计算 s = 1 + 1/(1×2) + 1/(1×2×3) + ... + 1/(n!)
python
n = int(input("请输入 n:"))
s = 0
t = 1 # t 记录每项的阶乘
for i in range(1, n + 1):
t = t / i # 利用上一项的结果,避免重复计算阶乘
s += t
print(f"多项式之和:{s}")