上机实验3——函数与代码复用
目的:理解函数封装与递归思想
实验任务:
- 基础 :编写函数cal_factorial(n)计算阶乘(循环实现)。
- 进阶 :用递归实现斐波那契数列(考虑添加缓存优化)。
- 拓展 :科赫曲线正向、反向绘制,加入绘制速度、绘制颜色等额外功能
提示 :递归函数需注意终止条件,避免栈溢出
思路
1. 基础:编写函数 cal_factorial(n) 计算阶乘(循环实现)
- 整体思想:
- 阶乘的定义是
n! = n * (n - 1) * (n - 2) * ... * 1,当n = 0或n = 1时,n! = 1。 - 为了实现这个功能,可以使用循环从 1 到
n依次相乘,最终得到阶乘结果。
- 阶乘的定义是
- 代码实现:
- 初始化一个变量
result为 1,用于存储阶乘结果。 - 利用
for循环遍历从 1 到n的所有整数,将每个整数累乘到result中。 - 循环结束后,
result即为n的阶乘。
- 初始化一个变量
2. 进阶:用递归实现斐波那契数列(考虑添加缓存优化)
- 整体思想:
- 斐波那契数列的定义是:
F(0) = 0,F(1) = 1,F(n) = F(n - 1) + F(n - 2)(n > 1)。 - 递归实现的关键在于明确递归的终止条件和递归关系。终止条件是
n <= 1,此时直接返回n;递归关系是F(n) = F(n - 1) + F(n - 2)。 - 递归过程中会有大量的重复计算,为了提高效率使用一个缓存来存储已经计算过的结果。
- 斐波那契数列的定义是:
- 代码实现:
- 定义一个全局字典
cache用于存储已经计算过的斐波那契数。 - 在递归函数
fibonacci中,首先检查n是否已经在cache中,如果是,则直接返回缓存中的结果。 - 若
n不在cache中,根据斐波那契数列的定义进行递归计算,并将结果存入cache中。
- 定义一个全局字典
3. 拓展:科赫曲线正向、反向绘制,加入绘制速度、绘制颜色等额外功能
- 整体思想:
- 科赫曲线是一种分形曲线,其递归定义为:当阶数
order = 0时,科赫曲线是一条直线;当order > 0时,将一条线段分成三等份,中间部分用一个等边三角形的两条边替代。 - 为了实现正向和反向绘制,可以通过一个参数
direction来控制绘制方向。 - 为了增加额外功能,可以添加
speed参数控制绘制速度,color参数控制绘制颜色。
- 科赫曲线是一种分形曲线,其递归定义为:当阶数
- 代码实现:
- 定义递归函数
koch_curve,当order = 0时,直接向前绘制一条长度为size的直线;当order > 0时,将线段分成三等份,递归调用koch_curve函数绘制每一部分,并根据规则进行转向。 - 在
draw_koch_snowflake函数中,调用koch_curve函数三次,每次旋转 120 度,绘制正向的科赫雪花;然后移动画笔位置,再次调用koch_curve函数三次,绘制反向的科赫雪花。
- 定义递归函数
完整代码:
import turtle
# 编写函数 cal_factorial(n) 计算阶乘(循环实现)
def cal_factorial(n):
result = 1
for i in range(1, n + 1):
result *= i
return result
# 用递归实现斐波那契数列(考虑添加缓存优化)
cache = {}
def fibonacci(n):
if n in cache:
return cache[n]
if n <= 1:
result = n
else:
result = fibonacci(n - 1) + fibonacci(n - 2)
cache[n] = result
return result
# 科赫曲线正向、反向绘制,加入绘制速度、绘制颜色等额外功能
def koch_curve(t, order, size, direction=1, speed=1, color='black'):
t.speed(speed)
t.pencolor(color)
if order == 0:
t.forward(size * direction)
else:
koch_curve(t, order - 1, size / 3, direction, speed, color)
t.left(60 * direction)
koch_curve(t, order - 1, size / 3, direction, speed, color)
t.right(120 * direction)
koch_curve(t, order - 1, size / 3, direction, speed, color)
t.left(60 * direction)
koch_curve(t, order - 1, size / 3, direction, speed, color)
def draw_koch_snowflake(order, size, speed=1, color='black'):
screen = turtle.Screen()
t = turtle.Turtle()
# 正向绘制
koch_curve(t, order, size, 1, speed, color)
t.right(120)
koch_curve(t, order, size, 1, speed, color)
t.right(120)
koch_curve(t, order, size, 1, speed, color)
# 反向绘制
t.penup()
t.goto(0, 200)
t.pendown()
koch_curve(t, order, size, -1, speed, color)
t.left(120)
koch_curve(t, order, size, -1, speed, color)
t.left(120)
koch_curve(t, order, size, -1, speed, color)
screen.exitonclick()
if __name__ == "__main__":
# 测试阶乘函数
print("阶乘计算结果:", cal_factorial(5))
# 测试斐波那契数列函数
print("斐波那契数列第 6 项:", fibonacci(6))
# 测试科赫曲线绘制
draw_koch_snowflake(order=3, size=300, speed=3, color='orange')
运行结果:



浙公网安备 33010602011771号