要学习的知识点
- 递推数列
- 相邻状态保存
- 多重赋值
- range() 循环边界
- 模运算
题目
练习 9:计算数列 a1=1、a2=1、an=an-1+an-2 的第 n 项。
输入正整数 n;同时输出原值和对 10007 取模后的值。
完整代码
以下内容与 ex09.py 一致,可对照右侧讲解阅读。
"""练习 9:计算数列 a1=1、a2=1、an=an-1+an-2 的第 n 项。
输入正整数 n;同时输出原值和对 10007 取模后的值。
学习说明:
- n 必须是正整数;数列前两项单独处理,因为递推式从第 3 项才开始。
- previous 和 current 保存相邻两项;每次更新后它们向后移动一位。
- 循环结束时 current 是第 n 项。answer 暂存最终结果,最后还输出 answer % 10007。
"""
n = int(input())
if n <= 0:
print("n must be positive")
else:
previous, current = 1, 1
if n == 1:
answer = previous
elif n == 2:
answer = current
else:
for _ in range(3, n + 1):
previous, current = current, previous + current
answer = current
print("value:", answer)
print("mod 10007:", answer % 10007)
进阶写法
这版与初学版解决同一道题,使用更精炼的语法或标准库工具。
进阶源码:ex09_adv.py
"""练习 9 进阶版:用相邻变量和递推循环计算数列项。"""
n = int(input())
if n <= 0:
print("n must be positive")
else:
previous, current = 1, 1
for _ in range(n - 2):
previous, current = current, previous + current
answer = previous if n == 1 else current
print("value:", answer)
print("mod 10007:", answer % 10007)
previous、current 通过多重赋值同步前进;range(n-2) 计算剩余项。n=1 时循环为空,单独选 previous 作为答案。
运行结果
示例输入:
7程序输出:
value: 13
mod 10007: 13逐个认识函数
下表根据程序中实际调用的函数和方法整理;自定义函数的实现与算法细节见后续说明。
| 函数形式 | 功能与返回值 | 注意事项 |
|---|---|---|
input(prompt='') | 读取一行文本,返回 str;若提供 prompt 会先显示提示。 | 返回值默认是字符串,计算前通常要做类型转换。 |
int(value, base=10) | 把整数文本或数值转换为整数。 | int('3.5') 不合法;按指定进制解析时可传 base。 |
print(*objects, sep=' ', end='\n') | 把对象转换为文本显示;返回 None。 | 默认空格分隔并在末尾换行。 |
range(start, stop, step=1) | 产生整数序列供循环或索引使用。 | stop 不包含在序列里。 |
递推的直观想法
递推是“下一步依赖之前已知结果”的计算方法。想象往表格里填数:前两格已知,后面每格将前两格相加。程序只需保存最近两格。
- 先单独处理 n=1 或 n=2,因为递推关系要从第 3 项才开始。
- previous、current 初始代表第 1 项和第 2 项。
- 每次更新为“旧 current、旧 previous+旧 current”,两个变量一起向右移动一项。
- 循环到 n 后,current 保存答案;再用取余输出模 10007 的结果。
语法与函数
| 写法 | 说明 | 返回/结果 |
|---|---|---|
int(input()) | 读字符串并转换成整数。 | 变量 n 的类型是 int。 |
range(start, stop) | 从 start 到 stop-1 生成序列。 | range(3, n + 1) 恰好遍历项号 3 到 n。 |
previous, current = current, previous + current | 多重赋值:右侧表达式先按旧值计算,再同时赋给左侧变量。 | 例如旧值 5、8,更新后是 8、13。 |
a % m | 取余运算,不是函数调用。 | 得到 a 除以 m 的余数,范围通常是 0 到 m-1。 |
print(...) | 输出文字和计算结果。 | 本程序分别标明完整值和模值。 |
为什么模运算有用
大数题常只要求结果除以某个数的余数。若只需要模值,可以每步及时取模:next_value = (previous + current) % 10007。本程序为了同时演示原值,先保存完整整数,再在输出时取模。实际竞赛中需依据题目要求和数据范围决定是否及时取模。
n 必须大于 0。本程序处理 n=1、2;输入 0 会给出提示,不会访问不存在的数列项。
代码如何运行
- 先按左侧题目给出的格式输入数据;程序通过 input() 读取,并在需要时转换数据类型。
- 程序自上而下执行语句;遇到条件、循环或函数调用时,按照右侧算法说明更新变量和处理数据。
- 最后由 print() 输出计算结果。可将左侧示例输入与输出逐项对照。
先自己跟踪一组小数据,记录循环前后变量的值;这比只看最终答案更容易理解程序。
自己动手试一试
测试 n=1、n=2、n=3;尝试只保存模 10007 的结果来计算较大的项。
先在 lx09.py 中独立完成,再运行参考程序比较结果。修改程序时一次只改一个条件或步骤。