实验 3 函数与代码复用

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

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

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

代码:

def cal_factorial(n):
 """
 使用循环计算阶乘。
 Args:
   n: 一个非负整数。
 Returns:
   n 的阶乘。如果 n 是负数,返回 None。
 """
 if n < 0:
   return None  # 阶乘只对非负整数定义
 
 factorial = 1
 for i in range(1, n + 1):
   factorial *= i
 
 return factorial
 
# 无限循环,持续等待输入
while True:
 try:
   num_str = input("请输入一个非负整数(输入 'q' 退出):")
 
   # 检查是否退出
   if num_str.lower() == 'q':
     print("程序已退出。")
     break
 
   num = int(num_str)  # 将字符串转换为整数
 except ValueError:
   print("输入无效,请输入一个整数或 'q'。")
   continue  # 继续下一次循环
 
 # 计算阶乘并打印结果
 result = cal_factorial(num)
 
 if result is not None:
   print(f"{num} 的阶乘是 {result}")
 else:
   print("无法计算负数的阶乘")
from functools import lru_cache
 
@lru_cache(maxsize=None)
def fibonacci(n):
 """
 使用递归和缓存计算斐波那契数列的第 n 项。
 Args:
   n: 一个非负整数,表示要计算的斐波那契数列的项数。
 Returns:
   斐波那契数列的第 n 项。
 """
 if n <= 1:
   return n
 else:
   return fibonacci(n-1) + fibonacci(n-2)
 
# 无限循环,持续等待输入
while True:
 try:
   num_str = input("请输入一个非负整数(输入 'q' 退出):")
 
   # 检查是否退出
   if num_str.lower() == 'q':
     print("程序已退出。")
     break
 
   num = int(num_str)  # 将字符串转换为整数
   if num < 0:
     print("请输入一个非负整数。")
     continue
 
 except ValueError:
   print("输入无效,请输入一个整数或 'q'。")
   continue  # 继续下一次循环
 
 # 计算斐波那契数列并打印结果
 result = fibonacci(num)
 print(f"斐波那契数列的第 {num} 项是 {result}")
import turtle
 
def koch_curve(turtle, length, depth, forward):
    """
    绘制科赫曲线。
    Args:
        turtle: Turtle 对象。
        length: 线段的长度。
        depth: 递归深度。
        forward: True 表示正向绘制,False 表示反向绘制。
    """
    if depth == 0:
        if forward:
            turtle.forward(length)
        else:
            turtle.backward(length)
    else:
        length /= 3.0
        koch_curve(turtle, length, depth - 1, forward)
        turtle.left(60) if forward else turtle.right(60)
        koch_curve(turtle, length, depth - 1, forward)
        turtle.right(120) if forward else turtle.left(120)
        koch_curve(turtle, length, depth - 1, forward)
        turtle.left(60) if forward else turtle.right(60)
        koch_curve(turtle, length, depth - 1, forward)
 
 
def draw_koch_snowflake(turtle, length, depth, forward, color, speed):
    """
    绘制科赫雪花。
    Args:
        turtle: Turtle 对象。
        length: 初始线段的长度。
        depth: 递归深度。
        forward: True 表示正向绘制,False 表示反向绘制。
        color: 绘制颜色。
        speed: 绘制速度 (0-10, 0 最快)。
    """
    turtle.color(color)
    turtle.speed(speed)
    for _ in range(3):
        koch_curve(turtle, length, depth, forward)
        turtle.right(120)
 
 
if __name__ == '__main__':
    screen = turtle.Screen()
    screen.bgcolor("white")  # 设置背景颜色
    screen.setup(width=800, height=600)  # 设置窗口大小
 
    pen = turtle.Turtle()
    pen.hideturtle()  # 隐藏乌龟
    pen.penup()
    pen.goto(-200, 100)  # 移动到起始位置
    pen.pendown()
 
    length = 400
    depth = 4
    forward = True  # True for forward, False for backward
    color = "blue"
    speed = 0  # 0 for fastest
 
    # 使用用户输入动态设置参数
    try:
        depth = int(screen.numinput("科赫雪花", "请输入递归深度 (整数):", default=4, minval=0, maxval=10))
    except TypeError:
        print("用户取消了递归深度输入,使用默认值。")
        depth = 4  # 使用默认值
 
    forward_str = screen.textinput("科赫雪花", "正向绘制 (True) 或反向绘制 (False):")
    if forward_str is None:
        print("用户取消了正向/反向输入,使用默认值。")
        forward = True  # 使用默认值
    else:
        forward = forward_str.lower() == "true"
 
    color = screen.textinput("科赫雪花", "请输入颜色 (例如: red, green, blue):")
    if color is None:
        print("用户取消了颜色输入,使用默认值。")
        color = "blue"  # 使用默认值
 
    try:
        speed = int(screen.numinput("科赫雪花", "请输入绘制速度 (0-10, 0 最快):", default=0, minval=0, maxval=10))
    except TypeError:
        print("用户取消了速度输入,使用默认值。")
        speed = 0  # 使用默认值
    except ValueError:
        print("输入的值不正确,请重新输入。使用默认值。")
 
    draw_koch_snowflake(pen, length, depth, forward, color, speed)
 
    screen.mainloop()  # 保持窗口显示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值