第5天python内容
Day 5:编程题冲刺 + 程序调试(必背版)
📌 今日目标
掌握递归、级数求和、程序调试技巧,能做对模拟题13-17题,为明天考试做最后冲刺!
第一部分:编程题13 - 递归函数【必考!】
题目详解
小球从100米高度落下,每次弹起高度是前一次的2/3,求第10次落地弹起的高度
解题思路【必背】
# 递归三要素:
# 1. 递归终止条件:第0次是初始高度100米
# 2. 递归公式:h(n) = h(n-1) * 2/3
# 3. 递归调用:bounce(n-1)def bounce(n):"""计算第n次落地弹起的高度参数:n - 第几次落地(n >= 0)返回:弹起的高度"""if n == 0: # 终止条件return 100 # 初始高度100米else: # 递归公式return bounce(n-1) * 2/3# 主程序
if __name__ == '__main__':# 方法1:直接调用height = bounce(10)print(f"第10次落地弹起的高度:{height:.2f}米")# 方法2:循环显示每次的高度for i in range(11):h = bounce(i)print(f"第{i}次落地弹起的高度:{h:.2f}米")
【执行过程分析】
bounce(10)
= bounce(9) * 2/3
= bounce(8) * 2/3 * 2/3
= bounce(7) * 2/3 * 2/3 * 2/3
= ...
= bounce(0) * (2/3)^10
= 100 * (2/3)^10
≈ 1.73米
【类似题目练习】
# 练习1:小球从h米高度落下,每次弹起k倍,求第n次高度
def bounce_general(h, k, n):"""h: 初始高度k: 弹起系数(如2/3)n: 第几次落地"""if n == 0:return helse:return bounce_general(h, k, n-1) * kprint(bounce_general(100, 0.8, 5)) # 初始100米,每次0.8倍# 练习2:求小球经过的总路程
def total_distance(n):"""计算前n次落地总共经过的路程"""if n == 0:return 100 # 第一次下落100米else:h = bounce(n-1) # 第n-1次弹起高度return total_distance(n-1) + 2*h # 上升h + 下降hprint(f"总路程:{total_distance(10):.2f}米")
第二部分:编程题14 - 级数求和【核心!】
题目详解
计算级数和:S = 1 - 1/(2!×2) + 1/(3!×3) - 1/(4!×4) + …
直到某一项的绝对值小于1E-6为止,并统计计算了多少项
解题思路【必背】
# 1. 观察通项公式:
# 第n项 = (-1)^(n+1) * 1/(n! * n)
# 2. 递推关系:
# factorial(n) = factorial(n-1) * n
# term(n) = -term(n-1) * (n-1) / (n * n)
# 3. 终止条件:|term| < 1e-6
完整代码【必背】
# 方法1:递推法(推荐)
def series_sum():"""计算级数和,误差在1e-6以内返回:(级数和, 计算项数)"""S = 0 # 级数和n = 1 # 项数计数factorial = 1 # n的阶乘term = 1 # 当前项的值while abs(term) >= 1e-6:S += termn += 1factorial *= n # 递推计算阶乘# 计算第n项:(-1)^(n+1) * 1/(n! * n)term = -term * (n-1) / (n * n) # 递推公式return S, n-1 # n-1是实际计算的项数# 主程序
if __name__ == '__main__':result, count = series_sum()print(f"级数的和,误差在1e-06以内是:{result}")print(f"总共计算了{count}项。")
【详细解析】
# 第1项:term1 = 1
# 第2项:term2 = -1/(2!×2) = -1/4
# 第3项:term3 = 1/(3!×3) = 1/18
# 第4项:term4 = -1/(4!×4) = -1/96# 递推关系推导:
# term(n) / term(n-1) = [(-1)^(n+1) * 1/(n!×n)] / [(-1)^n * 1/((n-1)!×(n-1))]
# = -1 * (n-1)!×(n-1) / (n!×n)
# = -(n-1) / (n×n)# 所以:term(n) = term(n-1) * [-(n-1)/(n×n)]
方法2:直接计算(备用)
import mathdef series_sum_v2():"""直接计算每一项"""S = 0n = 1while True:# 计算n!factorial = math.factorial(n)# 计算第n项term = ((-1) ** (n+1)) / (factorial * n)if abs(term) < 1e-6:breakS += termn += 1return S, nresult, count = series_sum_v2()
print(f"级数的和:{result}")
print(f"总共计算了{count}项。")
【类似题目练习】
# 练习1:计算e的近似值
# e = 1 + 1/1! + 1/2! + 1/3! + ...
def calc_e():e = 1n = 1factorial = 1term = 1while abs(term) >= 1e-6:n += 1factorial *= nterm = 1 / factoriale += termreturn e, nresult, count = calc_e()
print(f"e的近似值:{result}")
print(f"共计算{count}项")# 练习2:计算π的近似值
# π/4 = 1 - 1/3 + 1/5 - 1/7 + ...
def calc_pi():pi4 = 0n = 0term = 1while abs(term) >= 1e-6:term = ((-1) ** n) / (2*n + 1)pi4 += termn += 1return pi4 * 4, nresult, count = calc_pi()
print(f"π的近似值:{result}")
print(f"共计算{count}项")# 练习3:计算sin(x)的近似值
# sin(x) = x - x³/3! + x⁵/5! - x⁷/7! + ...
def calc_sin(x):"""计算sin(x)的近似值"""import mathsin_x = 0n = 0term = x # 第一项是xwhile abs(term) >= 1e-6:sin_x += termn += 1# 递推:term(n+1) = term(n) * (-x²) / ((2n+2)(2n+3))term = -term * x * x / ((2*n+1) * (2*n+2))return sin_x, n+1result, count = calc_sin(1) # sin(1)
print(f"sin(1)的近似值:{result}")
print(f"math.sin(1):{math.sin(1)}")
print(f"共计算{count}项")
第三部分:编程题15 - 函数+列表【重要!】
题目详解
编写函数f,将n以内个位、十位、百位上至少有1个3的数存放在列表L中返回
主函数随机生成1个3位数n,调用函数f,按每行10个输出
完整代码【必背】
import randomdef f(n):"""找出1到n之间,个位、十位、百位上至少有一个3的数参数:n - 上限(包含)返回:符合条件的数的列表"""L = []for num in range(1, n+1):# 方法1:转字符串判断if '3' in str(num):L.append(num)# 方法2:数学方法判断# ge = num % 10 # 个位# shi = num // 10 % 10 # 十位# bai = num // 100 # 百位# if ge == 3 or shi == 3 or bai == 3:# L.append(num)return L# 主函数
if __name__ == '__main__':# 随机生成3位数n = random.randint(100, 999)print(f"随机生成的3位整数是:{n}")# 调用函数result = f(n)# 输出结果print("满足条件的数有:")for i in range(0, len(result), 10): # 每行10个# 方法1:切片line = result[i:i+10]print(' '.join(map(str, line)))# 方法2:循环# for j in range(i, min(i+10, len(result))):# print(result[j], end=' ')# print() # 换行
【详细解析】
# 1. 判断是否包含3的两种方法:# 方法1:转字符串(简单)
if '3' in str(num):L.append(num)# 方法2:数学方法(高效)
ge = num % 10 # 个位
shi = num // 10 % 10 # 十位
bai = num // 100 # 百位
if ge == 3 or shi == 3 or bai == 3:L.append(num)# 2. 每行输出10个的两种方法:# 方法1:切片 + join
for i in range(0, len(result), 10):line = result[i:i+10]print(' '.join(map(str, line)))# 方法2:enumerate计数
for idx, num in enumerate(result):print(num, end=' ')if (idx + 1) % 10 == 0:print() # 每10个换行# 方法3:双重循环
for i in range(0, len(result), 10):for j in range(i, min(i+10, len(result))):print(result[j], end=' ')print()
【拓展题目】
# 拓展1:找出水仙花数(100-999)
def narcissistic_numbers():"""水仙花数:各位数字立方和等于该数本身如:153 = 1³ + 5³ + 3³"""result = []for num in range(100, 1000):# 方法1:字符串s = str(num)if int(s[0])**3 + int(s[1])**3 + int(s[2])**3 == num:result.append(num)# 方法2:数学# bai = num // 100# shi = num // 10 % 10# ge = num % 10# if bai**3 + shi**3 + ge**3 == num:# result.append(num)return resultprint(narcissistic_numbers()) # [153, 370, 371, 407]# 拓展2:找出回文数
def palindrome_numbers(n):"""找出n以内的回文数"""result = []for num in range(1, n+1):s = str(num)if s == s[::-1]: # 正序等于倒序result.append(num)return resultprint(palindrome_numbers(100))# 拓展3:找出完全数
def perfect_numbers(n):"""完全数:等于其所有因子之和(不含自身)如:6 = 1 + 2 + 3"""result = []for num in range(2, n+1):factors_sum = sum([i for i in range(1, num) if num % i == 0])if factors_sum == num:result.append(num)return resultprint(perfect_numbers(1000)) # [6, 28, 496]
第四部分:程序调试题16【必考!】
题目详解
统计每个歌手的歌曲总时长,程序有4个错误
playlist = ["青花瓷-周杰伦-240", "简单爱-周杰伦-220", "小幸运-田馥甄-230", "追光者-岑宁儿-250", "演员-薛之谦-260"]# 原始错误代码
dict.play = [] # ❌ 错误1
for item in playlist:items = item.split("-")player = items[1]time = items[2]for player in dict-play: # ❌ 错误2dictPlay[player] += time # ❌ 错误3else:dictPlay[player] = 1 # ❌ 错误4for player in dict-play:print(player, dictplay[player])
错误分析【必背】
# 错误1:dict.play = []
# 问题:
# 1. 变量名不能有点号
# 2. 应该创建字典,不是列表
# 改正:
dict_play = {} # 此行有错误,已经改正# 错误2:for player in dict-play
# 问题:
# 1. 应该是if判断,不是for循环
# 2. dict-play是减法,应该是dict_play
# 3. 应该用in判断是否存在
# 改正:
if player in dict_play: # 此行有错误,已经改正# 错误3:dictPlay[player] += time
# 问题:
# 1. 变量名不一致(dict_play vs dictPlay)
# 2. time是字符串,需要转int
# 改正:
dict_play[player] += int(time) # 此行有错误,已经改正# 错误4:dictPlay[player] = 1
# 问题:
# 1. 变量名不一致
# 2. 初始值应该是time,不是1
# 改正:
dict_play[player] = int(time) # 此行有错误,已经改正
完整正确代码【必背】
playlist = ["青花瓷-周杰伦-240", "简单爱-周杰伦-220", "小幸运-田馥甄-230", "追光者-岑宁儿-250", "演员-薛之谦-260"]dict_play = {} # 此行有错误,已经改正for item in playlist:items = item.split("-")player = items[1]time = items[2]if player in dict_play: # 此行有错误,已经改正dict_play[player] += int(time) # 此行有错误,已经改正else:dict_play[player] = int(time) # 此行有错误,已经改正for player in dict_play:print(player, dict_play[player])# 输出:
# 周杰伦 460
# 田馥甄 230
# 岑宁儿 250
# 薛之谦 260
【调试技巧总结】
# 1. 变量命名规范
# - 不能有特殊符号(. - 等)
# - 全局保持一致
# - 见名知义# 2. 数据类型
# - 字典用{},列表用[]
# - 字符串转数字要用int()或float()# 3. 条件判断
# - 判断存在用if...in
# - 遍历用for...in# 4. 常见错误模式
# - 变量名不一致
# - 数据类型错误
# - 语法结构错误(if写成for)
# - 逻辑错误(初始值错误)
第五部分:程序调试题17【必考!】
题目详解
停车费用计算,程序有4个错误
# 收费规则:
# 1小时内(含1小时):5元
# 超过1小时:每半小时2元(不足半小时按半小时算)# 原始错误代码
def calculate_parking_fee():base_fee = 5fee_half_hour = 2ifparking(times <= 60 # ❌ 错误1total_fee = base_feeelse:extra_minutes = parking_time - 60ifextra_minutes // 30 == 0 # ❌ 错误2extra_fee = fee_half_hour * extra_minutes // 30else:extra_fee = fee_half_hour * extra_minutes // 30 + 1 # ❌ 错误3total_fee = base_fee + extra_feereturn total_fee # ❌ 错误4(缩进)
错误分析【必背】
# 错误1:ifparking(times <= 60
# 问题:
# 1. if后面少空格
# 2. parking_time变量名错误
# 3. 条件判断后少冒号
# 改正:
if parking_time <= 60: # 此行有错误,已经改正# 错误2:ifextra_minutes // 30 == 0
# 问题:
# 1. if后少空格和冒号
# 2. 逻辑错误:应该是!=0(有余数)
# 改正:
if extra_minutes % 30 != 0: # 此行有错误,已经改正# 错误3:extra_fee = fee_half_hour * extra_minutes // 30 + 1
# 问题:
# 1. 运算符优先级问题
# 2. 应该是(extra_minutes // 30 + 1)
# 改正:
extra_fee = fee_half_hour * (extra_minutes // 30 + 1) # 此行有错误,已经改正# 错误4:return缩进问题
# 问题:return应该与def同级,不应该在else内
# 改正:return total_fee # 此行有错误,已经改正(调整缩进)
完整正确代码【必背】
def calculate_parking_fee(parking_time): # 添加参数base_fee = 5fee_half_hour = 2if parking_time <= 60: # 此行有错误,已经改正total_fee = base_feeelse:extra_minutes = parking_time - 60if extra_minutes % 30 != 0: # 此行有错误,已经改正extra_fee = fee_half_hour * (extra_minutes // 30 + 1) # 此行有错误,已经改正else:extra_fee = fee_half_hour * (extra_minutes // 30)total_fee = base_fee + extra_feereturn total_fee # 此行有错误,已经改正# 测试
print(calculate_parking_fee(30)) # 5元
print(calculate_parking_fee(60)) # 5元
print(calculate_parking_fee(90)) # 7元
print(calculate_parking_fee(100)) # 9元
print(calculate_parking_fee(150)) # 11元
【测试用例验证】
# 用例1:停30分钟 → 5元
# parking_time = 30
# 30 <= 60,total_fee = 5# 用例2:停60分钟 → 5元
# parking_time = 60
# 60 <= 60,total_fee = 5# 用例3:停90分钟 → 7元
# parking_time = 90
# 90 > 60
# extra_minutes = 30
# 30 % 30 == 0,进入else
# extra_fee = 2 * (30 // 30) = 2
# total_fee = 5 + 2 = 7# 用例4:停100分钟 → 9元
# parking_time = 100
# 100 > 60
# extra_minutes = 40
# 40 % 30 != 0,进入if
# extra_fee = 2 * (40 // 30 + 1) = 2 * 2 = 4
# total_fee = 5 + 4 = 9# 用例5:停150分钟 → 11元
# parking_time = 150
# 150 > 60
# extra_minutes = 90
# 90 % 30 == 0,进入else
# extra_fee = 2 * (90 // 30) = 2 * 3 = 6
# total_fee = 5 + 6 = 11
第六部分:程序调试总结【必背技巧】
调试步骤【记忆口诀】
一看语法二看逻辑,
三看变量四看类型,
五看缩进六看运算,
七测用例八验结果
常见错误类型【必背】
# 1. 语法错误
if x > 0 # 缺少冒号print(x)for i in range10): # 括号不匹配print(i)# 2. 变量名错误
myVar = 10
print(myvar) # 大小写不一致# 3. 缩进错误
def func():x = 10print(x) # 缩进不一致# 4. 数据类型错误
x = "10"
y = x + 5 # 字符串不能和整数相加# 5. 逻辑错误
if score >= 60:grade = "及格"
elif score >= 70: # 永远执行不到grade = "中"# 6. 运算符优先级
result = 2 + 3 * 4 # 14,不是20
result = fee * minutes // 30 + 1 # 可能不是期望的结果# 7. 条件判断错误
if x % 2 = 0: # 应该是==print("偶数")# 8. 循环变量冲突
for i in range(10):for i in range(5): # 覆盖了外层的iprint(i)
调试技巧【实用方法】
# 技巧1:打印调试
def func(x, y):print(f"DEBUG: x={x}, y={y}") # 打印参数result = x + yprint(f"DEBUG: result={result}") # 打印中间结果return result# 技巧2:分步执行
# 将复杂表达式拆分
# 错误写法:
result = func(a+b, c*d if x>0 else e*f)# 调试写法:
temp1 = a + b
temp2 = c * d if x > 0 else e * f
print(f"temp1={temp1}, temp2={temp2}")
result = func(temp1, temp2)# 技巧3:边界测试
def test_func():# 测试边界值assert func(0, 0) == 0assert func(1, 1) == 2assert func(-1, 1) == 0assert func(100, 200) == 300print("所有测试通过!")# 技巧4:类型检查
def func(x):print(f"x的类型:{type(x)}")print(f"x的值:{x}")# 继续处理...# 技巧5:使用try-except
try:result = int(input("输入数字:"))
except ValueError:print("输入不是有效的数字!")
📝 Day 5 综合作业
作业1:递归函数(必做)
# 1. 实现题13(小球弹跳)
# 要求:显示每次弹跳高度# 2. 计算1+2+3+...+100(递归实现)# 3. 汉诺塔问题(3个盘子)
def hanoi(n, A, B, C):"""n: 盘子数量A: 源柱子B: 辅助柱子C: 目标柱子"""# 请完成代码passhanoi(3, 'A', 'B', 'C')
作业2:级数求和(必做)
# 1. 实现题14(给定级数)# 2. 计算e的值(e = 1 + 1/1! + 1/2! + ...)# 3. 计算π/4(π/4 = 1 - 1/3 + 1/5 - 1/7 + ...)# 4. 计算ln(2)(ln(2) = 1 - 1/2 + 1/3 - 1/4 + ...)
作业3:列表处理(必做)
# 1. 实现题15(至少有一个3)# 2. 找出100-999的水仙花数# 3. 找出1-1000的完全数# 4. 生成前20个斐波那契数
作业4:程序调试(必做)
# 1. 调试题16(歌曲时长统计)
# 要求:找出所有4个错误并改正# 2. 调试题17(停车费用)
# 要求:找出所有4个错误并改正# 3. 自己制造4个错误,让同学调试
⚡ 考前最后冲刺清单
必背代码模板
# 1. 递归模板
def recursive_func(n):if 终止条件:return 基础值else:return 递归调用# 2. 级数求和模板
S = 0
n = 1
term = 初始项
while abs(term) >= 精度:S += termn += 1term = 递推公式# 3. 列表筛选模板
result = []
for item in data:if 条件:result.append(item)# 4. 字典统计模板
d = {}
for item in data:if item in d:d[item] += 1else:d[item] = 1# 5. 格式化输出模板
for i in range(0, len(lst), 10):line = lst[i:i+10]print(' '.join(map(str, line)))
必记知识点
# 1. 函数参数顺序
def func(位置参数, 默认参数, *args, **kwargs):pass# 2. 全局变量
global 变量名 # 要修改全局变量时# 3. 列表vs元组
列表:[],可变,有sort()
元组:(),不可变,无sort()# 4. 字典创建
d = {'key': value} # ✅
d = {'key', 'value'} # ❌ 这是集合# 5. 字符串判断
'0' <= c <= '9' # 判断数字字符
c.isdigit() # 判断数字字符# 6. 列表推导式
[表达式 for 变量 in 序列 if 条件]# 7. lambda函数
lambda 参数: 表达式# 8. 常见错误
- 变量名不一致
- 缺少冒号
- 缩进错误
- ==写成=
- 字符串和整数混用
答题技巧
1. 单选题:先排除明显错误选项
2. 填空题:注意变量名一致性
3. 编程题:先写思路再写代码
4. 调试题:逐行检查,标注错误
5. 时间分配:单选20分钟,填空30分钟,编程60分钟,调试30分钟
6. 检查重点:- 拼写错误- 缩进- 标点符号- 变量名- 数据类型
🎯 明天考试注意事项
考前准备
-
复习重点
- Day 1-5所有【必背】内容
- 模拟题答案及解析
- 错题本
-
物品准备
- 学生证
- 笔(黑色)
- 草稿纸
-
心态调整
- 早睡早起
- 适度紧张
- 相信自己
考试策略
-
读题技巧
- 看清题目要求
- 圈出关键词
- 理解再作答
-
答题顺序
- 先易后难
- 确保会做的不丢分
- 难题留在最后
-
时间控制
- 单选:每题1分钟
- 填空:每题3分钟
- 编程:每题15分钟
- 预留20分钟检查
-
检查要点
- 有没有漏题
- 变量名是否一致
- 缩进是否正确
- 输出格式是否符合要求
