第5天python内容

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. 检查重点:
   - 拼写错误
   - 缩进
   - 标点符号
   - 变量名
   - 数据类型

🎯 明天考试注意事项

考前准备

  1. 复习重点

    • Day 1-5所有【必背】内容
    • 模拟题答案及解析
    • 错题本
  2. 物品准备

    • 学生证
    • 笔(黑色)
    • 草稿纸
  3. 心态调整

    • 早睡早起
    • 适度紧张
    • 相信自己

考试策略

  1. 读题技巧

    • 看清题目要求
    • 圈出关键词
    • 理解再作答
  2. 答题顺序

    • 先易后难
    • 确保会做的不丢分
    • 难题留在最后
  3. 时间控制

    • 单选:每题1分钟
    • 填空:每题3分钟
    • 编程:每题15分钟
    • 预留20分钟检查
  4. 检查要点

    • 有没有漏题
    • 变量名是否一致
    • 缩进是否正确
    • 输出格式是否符合要求

相关推荐
froginwe112 小时前
Ruby 发送邮件 - SMTP
开发语言
ZhengEnCi2 小时前
P3E-Python Lambda表达式完全指南-什么是匿名函数?为什么90%程序员都在用?怎么快速掌握函数式编程利器?
后端·python
DKunYu2 小时前
1.多线程初阶
java·开发语言
ccut 第一混2 小时前
用c# 制作一个扑克牌小游戏
开发语言·c#
Ace_31750887762 小时前
京东商品详情接口深度解析:从反爬绕过到数据结构化重构
数据结构·python·重构
尤利乌斯.X2 小时前
在Java中调用MATLAB函数的完整流程:从打包-jar-到服务器部署
java·服务器·python·matlab·ci/cd·jar·个人开发
听风吟丶2 小时前
Java 9 + 模块化系统实战:从 Jar 地狱到模块解耦的架构升级
开发语言·python·pycharm
love530love2 小时前
【笔记】xFormers版本与PyTorch、CUDA对应关系及正确安装方法详解
人工智能·pytorch·windows·笔记·python·深度学习·xformers
2301_764441332 小时前
Streamlit搭建内网视频通话系统
python·https·音视频