Day 5:编程题冲刺 + 程序调试(必背版)
📌 今日目标
掌握递归、级数求和、程序调试技巧,能做对模拟题13-17题,为明天考试做最后冲刺!
第一部分:编程题13 - 递归函数【必考!】
题目详解
小球从100米高度落下,每次弹起高度是前一次的2/3,求第10次落地弹起的高度
解题思路【必背】
python
# 递归三要素:
# 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}米")
【执行过程分析】
python
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米
【类似题目练习】
python
# 练习1:小球从h米高度落下,每次弹起k倍,求第n次高度
def bounce_general(h, k, n):
"""
h: 初始高度
k: 弹起系数(如2/3)
n: 第几次落地
"""
if n == 0:
return h
else:
return bounce_general(h, k, n-1) * k
print(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 + 下降h
print(f"总路程:{total_distance(10):.2f}米")
第二部分:编程题14 - 级数求和【核心!】
题目详解
计算级数和:S = 1 - 1/(2!×2) + 1/(3!×3) - 1/(4!×4) + ...
直到某一项的绝对值小于1E-6为止,并统计计算了多少项
解题思路【必背】
python
# 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
完整代码【必背】
python
# 方法1:递推法(推荐)
def series_sum():
"""
计算级数和,误差在1e-6以内
返回:(级数和, 计算项数)
"""
S = 0 # 级数和
n = 1 # 项数计数
factorial = 1 # n的阶乘
term = 1 # 当前项的值
while abs(term) >= 1e-6:
S += term
n += 1
factorial *= 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}项。")
【详细解析】
python
# 第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:直接计算(备用)
python
import math
def series_sum_v2():
"""直接计算每一项"""
S = 0
n = 1
while True:
# 计算n!
factorial = math.factorial(n)
# 计算第n项
term = ((-1) ** (n+1)) / (factorial * n)
if abs(term) < 1e-6:
break
S += term
n += 1
return S, n
result, count = series_sum_v2()
print(f"级数的和:{result}")
print(f"总共计算了{count}项。")
【类似题目练习】
python
# 练习1:计算e的近似值
# e = 1 + 1/1! + 1/2! + 1/3! + ...
def calc_e():
e = 1
n = 1
factorial = 1
term = 1
while abs(term) >= 1e-6:
n += 1
factorial *= n
term = 1 / factorial
e += term
return e, n
result, count = calc_e()
print(f"e的近似值:{result}")
print(f"共计算{count}项")
# 练习2:计算π的近似值
# π/4 = 1 - 1/3 + 1/5 - 1/7 + ...
def calc_pi():
pi4 = 0
n = 0
term = 1
while abs(term) >= 1e-6:
term = ((-1) ** n) / (2*n + 1)
pi4 += term
n += 1
return pi4 * 4, n
result, 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 math
sin_x = 0
n = 0
term = x # 第一项是x
while abs(term) >= 1e-6:
sin_x += term
n += 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+1
result, 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个输出
完整代码【必背】
python
import random
def 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() # 换行
【详细解析】
python
# 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()
【拓展题目】
python
# 拓展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 result
print(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 result
print(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 result
print(perfect_numbers(1000)) # [6, 28, 496]
第四部分:程序调试题16【必考!】
题目详解
统计每个歌手的歌曲总时长,程序有4个错误
python
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: # ❌ 错误2
dictPlay[player] += time # ❌ 错误3
else:
dictPlay[player] = 1 # ❌ 错误4
for player in dict-play:
print(player, dictplay[player])
错误分析【必背】
python
# 错误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) # 此行有错误,已经改正
完整正确代码【必背】
python
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
【调试技巧总结】
python
# 1. 变量命名规范
# - 不能有特殊符号(. - 等)
# - 全局保持一致
# - 见名知义
# 2. 数据类型
# - 字典用{},列表用[]
# - 字符串转数字要用int()或float()
# 3. 条件判断
# - 判断存在用if...in
# - 遍历用for...in
# 4. 常见错误模式
# - 变量名不一致
# - 数据类型错误
# - 语法结构错误(if写成for)
# - 逻辑错误(初始值错误)
第五部分:程序调试题17【必考!】
题目详解
停车费用计算,程序有4个错误
python
# 收费规则:
# 1小时内(含1小时):5元
# 超过1小时:每半小时2元(不足半小时按半小时算)
# 原始错误代码
def calculate_parking_fee():
base_fee = 5
fee_half_hour = 2
ifparking(times <= 60 # ❌ 错误1
total_fee = base_fee
else:
extra_minutes = parking_time - 60
ifextra_minutes // 30 == 0 # ❌ 错误2
extra_fee = fee_half_hour * extra_minutes // 30
else:
extra_fee = fee_half_hour * extra_minutes // 30 + 1 # ❌ 错误3
total_fee = base_fee + extra_fee
return total_fee # ❌ 错误4(缩进)
错误分析【必背】
python
# 错误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 # 此行有错误,已经改正(调整缩进)
完整正确代码【必背】
python
def calculate_parking_fee(parking_time): # 添加参数
base_fee = 5
fee_half_hour = 2
if parking_time <= 60: # 此行有错误,已经改正
total_fee = base_fee
else:
extra_minutes = parking_time - 60
if 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_fee
return 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元
【测试用例验证】
python
# 用例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
第六部分:程序调试总结【必背技巧】
调试步骤【记忆口诀】
一看语法二看逻辑,
三看变量四看类型,
五看缩进六看运算,
七测用例八验结果
常见错误类型【必背】
python
# 1. 语法错误
if x > 0 # 缺少冒号
print(x)
for i in range10): # 括号不匹配
print(i)
# 2. 变量名错误
myVar = 10
print(myvar) # 大小写不一致
# 3. 缩进错误
def func():
x = 10
print(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): # 覆盖了外层的i
print(i)
调试技巧【实用方法】
python
# 技巧1:打印调试
def func(x, y):
print(f"DEBUG: x={x}, y={y}") # 打印参数
result = x + y
print(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) == 0
assert func(1, 1) == 2
assert func(-1, 1) == 0
assert func(100, 200) == 300
print("所有测试通过!")
# 技巧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:递归函数(必做)
python
# 1. 实现题13(小球弹跳)
# 要求:显示每次弹跳高度
# 2. 计算1+2+3+...+100(递归实现)
# 3. 汉诺塔问题(3个盘子)
def hanoi(n, A, B, C):
"""
n: 盘子数量
A: 源柱子
B: 辅助柱子
C: 目标柱子
"""
# 请完成代码
pass
hanoi(3, 'A', 'B', 'C')
作业2:级数求和(必做)
python
# 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:列表处理(必做)
python
# 1. 实现题15(至少有一个3)
# 2. 找出100-999的水仙花数
# 3. 找出1-1000的完全数
# 4. 生成前20个斐波那契数
作业4:程序调试(必做)
python
# 1. 调试题16(歌曲时长统计)
# 要求:找出所有4个错误并改正
# 2. 调试题17(停车费用)
# 要求:找出所有4个错误并改正
# 3. 自己制造4个错误,让同学调试
⚡ 考前最后冲刺清单
必背代码模板
python
# 1. 递归模板
def recursive_func(n):
if 终止条件:
return 基础值
else:
return 递归调用
# 2. 级数求和模板
S = 0
n = 1
term = 初始项
while abs(term) >= 精度:
S += term
n += 1
term = 递推公式
# 3. 列表筛选模板
result = []
for item in data:
if 条件:
result.append(item)
# 4. 字典统计模板
d = {}
for item in data:
if item in d:
d[item] += 1
else:
d[item] = 1
# 5. 格式化输出模板
for i in range(0, len(lst), 10):
line = lst[i:i+10]
print(' '.join(map(str, line)))
必记知识点
python
# 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分钟检查
-
检查要点
- 有没有漏题
- 变量名是否一致
- 缩进是否正确
- 输出格式是否符合要求