如何将绘制圆形排列分形的两个Python递归函数合并为一个?
嘿,我懂你这种无从下手的感觉!把两个递归逻辑揉成一个确实需要点思路转换,咱们一步步来搞定它~
首先先回顾下你原来的代码逻辑:
fract函数是递归绘制科赫曲线的变种,通过不同角度的左转来生成分形图案;circle函数则是循环调用fract多次,每次旋转固定角度,把这些分形段拼接成一个圆形。
要把它们整合成单个递归函数,核心是把「循环绘制分形段+旋转」的逻辑也改成递归形式,让同一个函数同时处理分形的深度递归和圆形的分段递归。
这里直接给你整合好的代码,然后咱们拆解下逻辑:
import turtle def combined_fractal_circle(t, fract_order, circle_segments, size): # 处理分形的递归绘制逻辑(对应原来的fract函数) if fract_order == 0: t.forward(size) else: for angle in (60, -120, 60, 0): # 递归绘制低一阶的分形,同时保留当前的圆形分段参数 combined_fractal_circle(t, fract_order - 1, circle_segments, size / 3) t.left(angle) # 处理圆形的递归拼接逻辑(对应原来的circle函数的循环) if circle_segments > 1: # 旋转到下一个分形段的起始角度 t.right(360 / circle_segments) # 递归绘制剩下的圆形分段,分形阶数和尺寸保持不变 combined_fractal_circle(t, fract_order, circle_segments - 1, size) # 测试调用,完全等价于你原来的circle(t, 4, 300) t = turtle.Turtle() t.speed(0) # 加快绘制速度 combined_fractal_circle(t, 2, 4, 300) turtle.done()
逻辑拆解:
- 分形递归部分:和你原来的
fract函数逻辑完全一致——当fract_order为0时,直接前进绘制基础线段;否则循环四个角度,递归调用自身处理低一阶的分形,完成后左转对应角度。 - 圆形递归部分:每画完一段完整的分形后,检查是否还有剩余的圆形分段(
circle_segments > 1)。如果有,就旋转到下一段的起始位置,然后递归调用自身,把剩余分段数减1,继续绘制下一段。
这样一来,单个函数就同时完成了分形的深度递归和圆形的分段递归,效果和你原来的两个函数完全一样!你可以试试调整fract_order(比如改成3)或者circle_segments(比如改成6),看看不同的图案效果~
内容的提问来源于stack exchange,提问作者rookie_senior
相关产品推荐
相关产品推荐

