Reputation:
If you run the following code, it creates two side by side drawings of what I am attempting to create. I need to figure out how to make the recursive method stop after drawing it the first time.
import turtle
def drawTriangle(size):
turtle.left(30)
turtle.forward(size)
turtle.right(120)
turtle.forward(size)
turtle.right(120)
turtle.forward(size)
turtle.right(120)
turtle.up()
turtle.forward(size)
turtle.right(30)
turtle.down()
def drawTriangles(size, depth):
if (depth < 1):
pass
else:
drawTriangle(size)
drawTriangles(size / 2, depth - 1)
turtle.up()
turtle.left(30)
turtle.forward(-size)
turtle.right(120)
turtle.forward(size * 2)
turtle.left(90)
turtle.down()
drawTriangle(size)
drawTriangles(size / 2, depth - 1)
turtle.up()
turtle.left(30)
turtle.forward(-size)
turtle.left(60)
turtle.forward(size * 2)
turtle.right(90)
turtle.down()
turtle.home()
turtle.left(90)
turtle.down()
turtle.speed("normal")
drawTriangles(100, 4)
input("pause")
Upvotes: 3
Views: 1461
Reputation: 6063
Here's my solution. I've tidied up some of the logic so, if the depth is not zero, the triangle gets drawn and the recursion is triggered twice, once for each top corner of the drawn triangle. Finally, the turtle is moved back to where it started.
The turtle is 'up' normally and is only put 'down' in the drawTriangle function. The drawTriangle function also now returns the turtle back to where it started.
Watch out for integer division. I've cast the size to a float before doing anything else.
import turtle
def drawTriangle(size):
turtle.down()
turtle.left(30)
turtle.forward(size)
turtle.right(120)
turtle.forward(size)
turtle.right(120)
turtle.forward(size)
turtle.right(150)
turtle.up()
def drawTriangles(size, depth):
size = float(size)
if (depth > 0):
drawTriangle(size)
turtle.left(30)
turtle.forward(size)
turtle.right(30)
drawTriangles(size / 2, depth - 1)
turtle.right(90)
turtle.forward(size)
turtle.left(90)
drawTriangles(size / 2, depth - 1)
turtle.left(150)
turtle.forward(size)
turtle.right(150)
turtle.home()
turtle.left(90)
turtle.speed("normal")
drawTriangles(150.0, 5)
input("pause")
Upvotes: 0
Reputation: 13869
First of all nice try. You were really close dude. And this seems like a fun project. :)
I've fixed your code and included it below. All you needed to do was add a special condition to check if you are on the "base" triangle or not. If so, return!
import turtle
def drawTriangle(size):
turtle.left(30)
turtle.forward(size)
turtle.right(120)
turtle.forward(size)
turtle.right(120)
turtle.forward(size)
turtle.right(120)
turtle.up()
turtle.forward(size)
turtle.right(30)
turtle.down()
def drawTriangles(size, depth, baseTriangle = False):
if (depth < 1):
pass
else:
drawTriangle(size)
drawTriangles(size / 2, depth - 1)
if baseTriangle:
return
turtle.up()
turtle.left(30)
turtle.forward(-size)
turtle.right(120)
turtle.forward(size * 2)
turtle.left(90)
turtle.down()
drawTriangle(size)
drawTriangles(size / 2, depth - 1)
turtle.up()
turtle.left(30)
turtle.forward(-size)
turtle.left(60)
turtle.forward(size * 2)
turtle.right(90)
turtle.down()
turtle.home()
turtle.left(90)
turtle.down()
turtle.speed("normal")
drawTriangles(100, 4, baseTriangle = True)
input("pause")
Upvotes: 1
Reputation: 4666
If I were to guess, it is probably because you are calling the following twice (in drawTriangles()) and the value of the size variable does not change between these two calls.
drawTriangle(size)
drawTriangles(size / 2, depth - 1)
Upvotes: 0