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() # 保持窗口显示