上机实验3——函数与代码复用

目的:理解函数封装与递归思想
实验任务:

  1. 基础 :编写函数cal_factorial(n)计算阶乘(循环实现)。
  2. 进阶 :用递归实现斐波那契数列(考虑添加缓存优化)。
  3. 拓展 :科赫曲线正向、反向绘制,加入绘制速度、绘制颜色等额外功能

提示 :递归函数需注意终止条件,避免栈溢出

思路

1. 基础:编写函数 cal_factorial(n) 计算阶乘(循环实现)

  • 整体思想
    • 阶乘的定义是 n! = n * (n - 1) * (n - 2) * ... * 1,当 n = 0n = 1 时,n! = 1
    • 为了实现这个功能,可以使用循环从 1 到 n 依次相乘,最终得到阶乘结果。
  • 代码实现
    • 初始化一个变量 result 为 1,用于存储阶乘结果。
    • 利用 for 循环遍历从 1 到 n 的所有整数,将每个整数累乘到 result 中。
    • 循环结束后,result 即为 n 的阶乘。

2. 进阶:用递归实现斐波那契数列(考虑添加缓存优化)

  • 整体思想
    • 斐波那契数列的定义是:F(0) = 0F(1) = 1F(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')

运行结果:


posted @ 2025-04-25 09:02  Uiui·  阅读(30)  评论(0)    收藏  举报