Python 练习讲解 · 09 / 25

递推:由前两项得到下一项

不用重新计算前面全部内容,只保存本次需要的相邻两项。

要学习的知识点

题目

练习 9:计算数列 a1=1、a2=1、an=an-1+an-2 的第 n 项。

输入正整数 n;同时输出原值和对 10007 取模后的值。

参考程序:ex09.py;空白练习:lx09.py。

完整代码

以下内容与 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 不包含在序列里。

递推的直观想法

递推是“下一步依赖之前已知结果”的计算方法。想象往表格里填数:前两格已知,后面每格将前两格相加。程序只需保存最近两格。

  1. 先单独处理 n=1 或 n=2,因为递推关系要从第 3 项才开始。
  2. previous、current 初始代表第 1 项和第 2 项。
  3. 每次更新为“旧 current、旧 previous+旧 current”,两个变量一起向右移动一项。
  4. 循环到 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 会给出提示,不会访问不存在的数列项。

代码如何运行

  1. 先按左侧题目给出的格式输入数据;程序通过 input() 读取,并在需要时转换数据类型。
  2. 程序自上而下执行语句;遇到条件、循环或函数调用时,按照右侧算法说明更新变量和处理数据。
  3. 最后由 print() 输出计算结果。可将左侧示例输入与输出逐项对照。

先自己跟踪一组小数据,记录循环前后变量的值;这比只看最终答案更容易理解程序。

自己动手试一试

测试 n=1、n=2、n=3;尝试只保存模 10007 的结果来计算较大的项。

先在 lx09.py 中独立完成,再运行参考程序比较结果。修改程序时一次只改一个条件或步骤。