4.4. Nested For Loops¶
A nested loop has one loop inside of another. These are typically used for working with two dimensions such as printing stars in rows and columns as shown below. When a loop is nested inside another loop, the inner loop runs many times inside the outer loop. In each iteration of the outer loop, the inner loop will be re-started. The inner loop must finish all of its iterations before the outer loop can continue to its next iteration.
What does the following code print out? Watch the code run in the Java visualizer by clicking the CodeLens button and then forward. Notice how the inner loop is started over for each row. Can you predict how many rows and columns of stars there will be?
Can you change the code to print a rectangle with 10 rows and 8 columns of stars? You can also try replacing line 10 with this print statement to see the rows and columns: System.out.print(row + "-" + col + " ");
- A rectangle of 7 rows with 5 stars per row.
- This would be true if i was initialized to 0.
- A rectangle of 7 rows with 4 stars per row.
- This would be true if i was initialized to 0 and the inner loop continued while
y < 5
. - A rectangle of 6 rows with 5 stars per row.
- The outer loop runs from 1 up to 7 but not including 7 so there are 6 rows and the inner loop runs 1 to 5 times including 5 so there are 5 columns.
- A rectangle of 6 rows with 4 stars per row.
- This would be true if the inner loop continued while
y < 5
.
4-4-2: What does the following code print?
for (int i = 1; i < 7; i++)
{
for (int y = 1; y <= 5; y++)
{
System.out.print("*");
}
System.out.println();
}
- A rectangle of 4 rows with 3 star per row.
- This would be true if i was initialized to 1 or ended at 4.
- A rectangle of 5 rows with 3 stars per row.
- Yes, the outer loop runs from 0 up to 5 but not including 5 so there are 5 rows and the inner loop runs from 3 down to 1 so 3 times.
- A rectangle of 4 rows with 1 star per row.
- The inner loop runs 3 times when j is 3, 2, and then 1, so there are 3 stars per row.
- The loops have errors.
- Try the code in an Active Code window and you will see that it does run.
4-4-3: What does the following code print?
for (int i = 0; i < 5; i++)
{
for (int j = 3; j >= 1; j--)
{
System.out.print("*");
}
System.out.println();
}
The main method in the following class should print 10 rows with 5 *s in each row. But, the blocks have been mixed up and include one extra block that isn’t needed in the solution. Drag the needed blocks from the left and put them in the correct order on the right. Click the Check button to check your solution.
4.4.1. Nested Loops with Turtles¶
Try nested loops with turtles to create a snowflake design!
The turtle below is trying to draw a square many times to create a snowflake pattern. Can you change the outer loop so that the pattern completes all the way around? Try different ending values for the counter i to find the smallest number that works between 5 and 15.
To make the drawing faster, you can call the World or Turtle object’s setSpeed method with a 0-100 delay value where 0 is the fastest. If the code below does not work in your browser, you use JuiceMind or replit or download the files here to use in your own IDE.
4.4.2. Programming Challenge : Turtle Snowflakes¶
In the last exercise, you used nested for-loops to have the turtle draw a square repeatedly to make a snowflake. Use the Active Code window below or in JuiceMind or replit to have yertle draw the following shapes using nested loops. We encourage you to work in pairs on this.
Complete the code in the active code window below to draw a snowflake of triangles. Remember that triangles have 3 sides and you will need to turn 120 degrees (external angle) 3 times to draw the triangle. Use the
turnAmount
variable for the single turn after drawing a triangle. How many times did you need to run the outer loop to go all the way around? Try changing theturnAmount
variable to 40 to see how many times you need to loop with a wider distance between the triangles.In the exercise above, you figured out how many times to run the outer loop to finish the snowflake. You may have noticed that the number of times the loop needs to run is related to the angle you turn before drawing the next triangle. These turns have to add up to 360 degrees to go all the way around. Change the outer loop so that it runs the number of times needed by using a formula with the
turnAmount
variable and 360. Can you draw a snowflake using more or less triangles than before by just changing theturnAmount
value?Create another variable called
n
for the number of sides in the polygon the inner loop draws. Change the angle in the inner loop to also use a formula with 360 and this new variable. Can you change your snowflake to draw squares or pentagons instead? (Note if this overwhelms the Active Code server and times out, try a largerturnAmount
. (Or you can switch to using JuiceMind or replit or your own IDE).Let’s add some more color! Add an
if
/else
statement that changes the Color of the pen before the inner loop depending on whether the outer loop variable is odd or even. Remember that even numbers have no remainder when divided by 2.Be creative and design a unique snowflake!
Use nested for-loops to have the turtle draw a snowflake of polygons. Use the variable turnAmount to turn after each shape and the variable n for the sides of the polygon.
To make the drawing faster, you can call the World or Turtle object’s setSpeed method with a 0-100 delay value where 0 is the fastest. If the code below does not work in your browser, you can use JuiceMind or replit or download the files here to use in your own IDE.
4.4.3. Summary¶
Nested iteration statements are iteration statements that appear in the body of another iteration statement.
When a loop is nested inside another loop, the inner loop must complete all its iterations before the outer loop can continue.