# Thinkcspy Chapter 8 Lab: Experimenting with 3n+1

Last Updated on November 19, 2023

# Experimenting With the 3n+1 Sequence

## Instructions

In this lab my job was to take the initial code, graph the iterations and find the max number of iterations from one of the 50 sequence starts.

## Initial Code

``````# Runestone.Academy thinkcspy course
# Chapter 8
# Lab

def seq3np1(n):
""" Print the 3n+1 sequence from n, terminating when it reaches 1."""

while n != 1:
print(n)
if n % 2 == 0:        # n is even
n = n // 2
else:                 # n is odd
n = n * 3 + 1
print(n)                  # the last print is 1
``````

## My Code

``````# Runestone.Academy thinkcspy course
# Chapter 8
# Lab

import turtle

border = 10

def writeData(tt, itr, height):
tt.goto(0-border, 0-border)
tt.up()

if height >= 100:
tt.left(90)
tt.forward(height+20)
tt.right(90)
tt.forward(itr*39)
tt.write(str(height), move=False, align='center', font=('Times New Roman', 30, 'normal'))
tt.forward(70)
tt.write(str(itr), move=False, align='center', font=('Times New Roman', 30, 'normal'))
else:                        # this is here so the last bar actually fills
tt.left(90)
tt.forward(height)
tt.right(90)
tt.forward(itr*40)
tt.right(90)
tt.forward(height)
tt.left(90)

def drawBar(t, height):
""" Get turtle t to draw one bar, of height. """
t.begin_fill()               # start filling this shape
t.left(90)
t.forward(height)
t.right(90)
t.forward(40)
t.right(90)
t.forward(height)
t.left(90)
t.end_fill()                 # stop filling this shape

def seq3np1(n):
""" Print the 3n+1 sequence from n, terminating when it reaches 1."""
count = 1

while n != 1:
count += 1

#print(n)
if n % 2 == 0:        # n is even
n = n // 2
else:                 # n is odd
n = n * 3 + 1
#print(n)                 # the last print is 1
#print(count)
return count

wn = turtle.Screen()             # Set up the window and its attributes
wn.setworldcoordinates(0-border, 0-border, 40*50+border, 150)
wn.bgcolor("lightblue")
wn.tracer(100)

tess = turtle.Turtle()           # create tess and set some attributes
tess.color("purple")
tess.fillcolor("magenta")
tess.pensize(3)

alex = turtle.Turtle()
alex.color("purple")

maxSoFar = 0

for i in range(50):
start = i + 1
result = seq3np1(start)

#print("Number of iterations to get to '1' from", start, ":", result)

drawBar(tess, result)
writeData(alex, start, result)

if result > maxSoFar:
maxSoFar = result

print("The max number of iterations was", maxSoFar, "from sequence start", start)
``````

## Result

The numbers are not very readable, but it gets the job done.