目的:理解函数封装与递归思想
实验任务:
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()
运行结果:
提示 :递归函数需注意终止条件,避免栈溢出