我想创建一个这样的输出:
我必须使用递归。
到目前为止,这就是我的代码:
from turtle import *
def drawFlake(length,depth):
fd(length)
input("first line done")
if depth>0:
left(60)
drawFlake(length/3,depth-1)
input("1")
left(120)
drawFlake(length/3,depth-1)
input("2")
left(120)
drawFlake(length/3,depth-1)
input("3")
left(120)
drawFlake(length/3,depth-1)
input("4")
left(120)
left(180)
#drawFlake(length/3,depth-1)
input("1")
left(120)
drawFlake(length/3,depth-1)
input("THIS IS THE LAST")
left(60)
left(180)
fd(length)
drawFlake(100,3)
这会产生这样的输出(这里,N = 3)
问题是左边是长行。应该没有长线。相反,应该有另一种薄片模式
我做错了什么?
编辑::
这是我设法提出的更好的东西。但它仍然不完美:
def doFigure(length,depth):
left(120)
fd(length)
if depth>1:
doFigure(length/3,depth-1)
bk(length)
right(60)
fd(length)
if depth>1:
doFigure(length/3,depth-1)
bk(length)
right(60)
fd(length)
if depth>1:
doFigure(length/3,depth-1)
bk(length)
right(60)
fd(length)
if depth>1:
doFigure(length/3,depth-1)
bk(length)
right(60)
fd(length)
if depth>1:
doFigure(length/3,depth-1)
bk(length)
right(60)
fd(length)
if depth == 3:
doFigure(length/3,depth-1)
bk(length)
right(180)
注意最后一行。我不得不对值3进行硬编码以获得正确的值。
答案 0 :(得分:1)
这是一个解决方案:它并不完美,因为与你发布的图纸相比,它在主干上有一堆额外的。
请告诉我这是否适合您。
来自海龟进口*
def drawFlake(length, depth):
"draws a flake"
if depth > 0:
for _ in range(6):
forward(length)
drawFlake(length // 3, depth - 1)
backward(length)
left(60)
drawFlake(200,4)
答案 1 :(得分:1)
几天后,我想出了一个解决方案。这绝对不是最好的解决方法(如果有更多的人发布他们的解决方案,我会很高兴),但它确实显示输出完全像我的原始图片。
def makeFlake(length,depth,isRoot=True):
"""
This function draws the flakes. To draw the smaller flakes, this function is called recursively
:param length: the length of the biggest flake's branch
:param depth: The number of smaller flakes to draw
:param isRoot: Draw an extra branch if the value is true. Note that true is the default value.
"""
if depth>0:
forward(length)
makeFlake(length // 3, depth - 1,False)
backward(length)
left(60)
forward(length)
makeFlake(length // 3, depth - 1,False)
backward(length)
left(60)
forward(length)
makeFlake(length // 3, depth - 1,False)
backward(length)
left(60)
forward(length)
if isRoot == True:
makeFlake(length // 3, depth - 1,False)
backward(length)
left(60)
forward(length)
makeFlake(length // 3, depth - 1,False)
backward(length)
left(60)
forward(length)
makeFlake(length // 3, depth - 1,False)
backward(length)
left(60)
答案 2 :(得分:1)
如果要精确地绘制它,则必须跳过6条辐条中每第4个最里面的雪花(即从0到5循环跳过每一个“ 3”)
这是一个代码
import turtle as t
#assigning random value for outer at the start, this will be changed later
OUTER=-1
LEN=300
def drawSnowflake(N,LEN):
if N<0:
return
for i in range(6):
t.forward(LEN)
#skipping every 4th spoke but not for the level N
if i==3 and N!=OUTER:
pass
else:
drawSnowflake(N-1,LEN/4)
t.backward(LEN)
t.left(60)
def main():
N=int(input("Enter a max value of N"))
global OUTER
OUTER=N
t.speed(0)
drawSnowflake(N,LEN)
t.exitonclick()
if __name__=="__main__":
main()
答案 3 :(得分:1)
我喜欢@amipro(+1)的解决方案,除了它会覆盖现有的行(效率低下,请仔细查看。)而且我也更喜欢您在自己的解决方案(+1)中标记根系的方法。因此,这是我自己的解决方案,希望能同时体现两者的优点:
from turtle import *
def makeFlake(length, depth, isRoot=True):
if depth > 0:
for branch in range(6):
if isRoot or branch != 3:
forward(length)
makeFlake(length / 3, depth - 1, False)
backward(length)
left(60)
tracer(False) # because I have no patience
makeFlake(100, 4)
tracer(True)
hideturtle()
exitonclick()