基于Python Turtle模块的递归嵌套圆形绘制实现问询
用Python Turtle递归绘制嵌套圆形图案
先给你理清楚递归实现的核心逻辑,再上代码,一步步拆解:
递归的核心思路
递归就是函数自己调用自己,但必须有明确的终止条件,不然会无限循环。这个图案的递归逻辑很直观:
- 每一层画一个圆
- 在这个圆的圆周上,均匀放6个更小的圆的圆心
- 对每个小圆,重复上面的操作,直到圆小到看不见(终止条件)
具体实现步骤
- 确定递归函数参数:需要知道当前要画的圆的圆心坐标(x, y)、半径r,这三个参数足够定位和绘制当前圆。
- 终止条件:当半径r小于某个阈值(比如5),直接返回,停止递归——再小的圆没必要画了。
- 绘制当前圆:移动到圆心下方(turtle画圆是从当前位置的左侧开始,所以要调整到圆心正下方再画),然后画圆。
- 计算6个小圆的位置:
- 每个小圆的圆心在当前圆的圆周上,相邻两个圆心的角度差是60°(360°/6)
- 小圆的半径设为当前半径的1/3,这样不会和其他小圆或大圆重叠,视觉效果刚好
- 用三角函数计算每个小圆的圆心坐标:
x_new = x + r * cos(角度),y_new = y + r * sin(角度)
- 递归调用:对每个计算出的小圆位置,调用同一个函数,传入新的坐标和缩小后的半径。
完整代码示例
import turtle import math def draw_nested_circles(x, y, radius): # 终止条件:半径太小就停止 if radius < 5: return turtle.penup() # 移动到当前圆的底部(turtle画圆的起始点) turtle.goto(x, y - radius) turtle.pendown() # 绘制当前圆 turtle.circle(radius) # 计算6个小圆的位置,角度从0到360度,间隔60度 for angle in range(0, 360, 60): # 将角度转为弧度 radian = math.radians(angle) # 小圆的圆心在当前圆的圆周上 new_x = x + radius * math.cos(radian) new_y = y + radius * math.sin(radian) # 递归绘制小圆,半径为当前的1/3 draw_nested_circles(new_x, new_y, radius / 3) # 初始化turtle turtle.speed(0) # 最快速度 turtle.hideturtle() # 从屏幕中心开始画,初始半径设为100 draw_nested_circles(0, 0, 100) # 保持窗口显示 turtle.done()
代码细节解释
turtle.speed(0):设置最快绘制速度,避免等待太久turtle.hideturtle():隐藏画笔光标,让图案更整洁- 为什么小圆半径是当前的1/3?因为如果设为1/2,小圆会和大圆内切,还会互相重叠,1/3的比例刚好让每个小圆都在大圆内部,且彼此不碰
- 三角函数计算位置:把角度转成弧度(math库的函数需要弧度),然后用圆周坐标公式计算每个小圆的中心
运行代码后,你就能看到从中心大圆开始,一层层嵌套6个小圆的图案,直到圆小到阈值为止。
内容的提问来源于stack exchange,提问作者Alex Sokolov
相关产品推荐
相关产品推荐

