实验3 函数与代码复用

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


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

def cal_factorial(n):
    """
    循环实现阶乘计算
    :param n: 非负整数
    :return: n的阶乘
    """
    if n < 0:
        raise ValueError("n必须为非负整数")
    result = 1
    for i in range(1, n + 1):
        result *= i
    return result


# 示例调用
if __name__ == "__main__":
    try:
        num = int(input("请输入一个非负整数来计算其阶乘: "))
        print(f"{num}的阶乘为: {cal_factorial(num)}")
    except ValueError as e:
        if "invalid literal" in str(e):
            print("输入错误,请输入一个有效的非负整数。")
        else:
            print(f"计算错误: {e}")

运行结果:


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

def fibonacci_cache(n, cache=None):
    """
    带手动缓存的递归斐波那契数列计算
    :param n: 数列索引(0开始)
    :param cache: 缓存字典(内部使用)
    :return: 第n项斐波那契数
    """
    if cache is None:
        cache = {}
    if n in cache:
        return cache[n]
    if n <= 1:
        result = n
    else:
        result = fibonacci_cache(n - 1, cache) + fibonacci_cache(n - 2, cache)
    cache[n] = result
    return result


# 示例调用
if __name__ == "__main__":
    try:
        index = int(input("请输入一个非负整数来计算斐波那契数列的对应项: "))
        if index < 0:
            raise ValueError("输入必须为非负整数")
        print(f"第{index}项斐波那契数为: {fibonacci_cache(index)}")
    except ValueError as e:
        if "invalid literal" in str(e):
            print("输入错误,请输入一个有效的非负整数。")
        else:
            print(f"计算错误: {e}")

运行结果:


3. 拓展 :科赫曲线正向、反向绘制,加入绘制速度、绘制颜色等额外功能

import turtle


def koch_curve(turtle_obj, length, order, color, speed):
    """
    绘制科赫曲线
    :param turtle_obj: 海龟绘图对象
    :param length: 线段长度
    :param order: 递归阶数
    :param color: 绘制颜色
    :param speed: 绘制速度(1-10)
    """
    turtle_obj.speed(speed)
    turtle_obj.color(color)
    if order == 0:
        turtle_obj.forward(length)
    else:
        koch_curve(turtle_obj, length / 3, order - 1, color, speed)
        turtle_obj.left(60)
        koch_curve(turtle_obj, length / 3, order - 1, color, speed)
        turtle_obj.right(120)
        koch_curve(turtle_obj, length / 3, order - 1, color, speed)
        turtle_obj.left(60)
        koch_curve(turtle_obj, length / 3, order - 1, color, speed)


def draw_koch_snowflake():
    screen = turtle.Screen()
    screen.title("科赫雪花曲线绘制")

    t = turtle.Turtle()
    # 固定参数绘制,也可按需调整
    color = "black"
    speed = 10
    order = 4
    length = 200

    for _ in range(3):
        koch_curve(t, length, order, color, speed)
        t.right(120)

    screen.exitonclick()


if __name__ == "__main__":
    draw_koch_snowflake()

运行结果:


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值