user2770299
user2770299

Reputation:

Recursive method of shrinking triangles in Python

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

Answers (3)

Graeme Stuart
Graeme Stuart

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

Shashank
Shashank

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

Manoj Pandey
Manoj Pandey

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

Related Questions