collections, part fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... ·...

142
Collections, Part Four

Upload: others

Post on 20-May-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

Collections, Part Four

Page 2: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

Announcements● Remember to send the introductory

email from assignment 1 and cc me.● I'm reading all the emails and the

introductory information is very important to me (in particular when it can help me be a more effective teacher)

● No lecture or section tomorrow● Wednesday and Friday sections still

happening● Please go to or watch the SCPD section if

you're in a Thursday section

Page 3: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

From the Last 3 Lectures...● Stack: Ordered sequence of data, access

from top● Vector: Ordered sequence of data

● Grid: 2D Ordered sequence of data

● Lexicon: Large, unordered container of strings that doesn't change over time

● Set: Unordered container of distinct elements

● Map: Unordered container of key-value pairs. Keys are distinct

Page 4: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

Queue

Page 5: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

Queue

● A Queue is a data structure representing a waiting line.

● Objects can be enqueued to the back of the line or dequeued from the front of the line.

● No other objects in the queue are visible.● Example: A checkout counter.

137

Page 6: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

Queue

● A Queue is a data structure representing a waiting line.

● Objects can be enqueued to the back of the line or dequeued from the front of the line.

● No other objects in the queue are visible.● Example: A checkout counter.

137 42

Page 7: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

Queue

● A Queue is a data structure representing a waiting line.

● Objects can be enqueued to the back of the line or dequeued from the front of the line.

● No other objects in the queue are visible.● Example: A checkout counter.

137 42 271

Page 8: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

Queue

● A Queue is a data structure representing a waiting line.

● Objects can be enqueued to the back of the line or dequeued from the front of the line.

● No other objects in the queue are visible.● Example: A checkout counter.

42 271

Page 9: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

Queue

● A Queue is a data structure representing a waiting line.

● Objects can be enqueued to the back of the line or dequeued from the front of the line.

● No other objects in the queue are visible.● Example: A checkout counter.

42 271 314

Page 10: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

Queue

● A Queue is a data structure representing a waiting line.

● Objects can be enqueued to the back of the line or dequeued from the front of the line.

● No other objects in the queue are visible.● Example: A checkout counter.

271 314

Page 11: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

Queue

● A Queue is a data structure representing a waiting line.

● Objects can be enqueued to the back of the line or dequeued from the front of the line.

● No other objects in the queue are visible.● Example: A checkout counter.

314

Page 12: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

Listing All Strings

● Suppose we want to generate all strings of letters A and B of length at most three.

● How might we do this?

Page 13: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

"" "A" "B" "AA" "AB" "BA" "BB"

Page 14: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

""

"A" "B"

"AA" "AB" "BA" "BB"

Page 15: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

""

"A" "B"

"AA" "AB" "BA" "BB"

Page 16: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

""

"A" "B"

"AA" "AB" "BA" "BB"

Page 17: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

""

"A" "B"

"AA" "AB" "BA" "BB"

""

Page 18: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

""

"A" "B"

"AA" "AB" "BA" "BB"

""

Page 19: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

""

"A" "B"

"AA" "AB" "BA" "BB"

""

Page 20: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

""

"A" "B"

"AA" "AB" "BA" "BB"

"" "A" "B"

Page 21: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

""

"A" "B"

"AA" "AB" "BA" "BB"

"A" "B"

Page 22: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

""

"A" "B"

"AA" "AB" "BA" "BB"

"A"

"B"

Page 23: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

""

"A" "B"

"AA" "AB" "BA" "BB"

"A"

"B"

Page 24: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

""

"A" "B"

"AA" "AB" "BA" "BB"

"A"

"B"

"AA" "AB"

Page 25: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

""

"A" "B"

"AA" "AB" "BA" "BB"

"B" "AA" "AB"

Page 26: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

""

"A" "B"

"AA" "AB" "BA" "BB"

"B"

"AA" "AB"

Page 27: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

""

"A" "B"

"AA" "AB" "BA" "BB"

"B"

"AA" "AB"

Page 28: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

""

"A" "B"

"AA" "AB" "BA" "BB"

"B"

"AA" "AB"

"BA" "BB"

Page 29: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

""

"A" "B"

"AA" "AB" "BA" "BB"

"AA" "AB" "BA" "BB"

Page 30: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

""

"A" "B"

"AA" "AB" "BA" "BB"

"AA"

"AB" "BA" "BB"

Page 31: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

""

"A" "B"

"AA" "AB" "BA" "BB"

"AA"

"AB" "BA" "BB"

Page 32: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

""

"A" "B"

"AA" "AB" "BA" "BB"

"AB" "BA" "BB"

Page 33: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

""

"A" "B"

"AA" "AB" "BA" "BB"

"AB"

"BA" "BB"

Page 34: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

""

"A" "B"

"AA" "AB" "BA" "BB"

"AB"

"BA" "BB"

Page 35: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

""

"A" "B"

"AA" "AB" "BA" "BB"

"BA" "BB"

Page 36: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

""

"A" "B"

"AA" "AB" "BA" "BB"

"BA"

"BB"

Page 37: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

""

"A" "B"

"AA" "AB" "BA" "BB"

"BA"

"BB"

Page 38: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

""

"A" "B"

"AA" "AB" "BA" "BB"

"BB"

Page 39: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

""

"A" "B"

"AA" "AB" "BA" "BB"

"BB"

Page 40: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

""

"A" "B"

"AA" "AB" "BA" "BB"

"BB"

Page 41: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

""

"A" "B"

"AA" "AB" "BA" "BB"

Page 42: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

Listing All Strings

● Using a Queue we can list all strings of length less than 3 in order of string length!● Keep this in mind moving forward.

Page 43: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

Application: Cracking Passwords

Page 44: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

Disclaimer

● I am not trying to teach you how to hack into computer systems!

● This lecture explores techniques for attacking password systems.

● My intent is to help you better understand computer security and to motivate the techniques from the next section of CS106B.

● Do not use these techniques offensively! It is illegal!

Page 45: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

The Setup

● Suppose that you have a mystery function

bool login(string& username, string& password);

● This function takes in a username and password, then tells you whether it is correct.

● Suppose that you know someone's username. How might you break in to their account?

Page 46: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Brute-Force Attack

● Idea: Try logging in with all possible passwords!● Try logging in with all strings of length 0,

then all strings of length 1, then all strings of length 2, …

● Eventually, this will indeed crack the password.

● What would this look like in code?● How fast will it be?

Page 47: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

all-strings(Pseudocode)

Page 48: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

all-strings.cpp(Computer)

Page 49: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

Why Brute-Forcing is Hard

Page 50: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

Analyzing Efficiency

● How long will it take for our program to crack a password?

● Let's make the following assumptions:● The password consists purely of lowercase letters.● The password has length at most n.

● There are 26k possible lowercase strings of length k.

● Might have to try all strings of length 0, 1, …, n.

● To break the password, we need to try at most

different strings.

1+26+262+263

+264+...+26n=

26n+1−125

Page 51: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

How Many Strings?

● If n = 0, might have to try 1 string.

● If n = 1, might have to try 27 strings.

● If n = 2, might have to try 703 strings.

● If n = 3, might have to try 18,279 strings.

● …

● If n = 8, might have to try 217,180,147,159 strings.

● …

● If n = 15, might have to try 1,744,349,715,977,154,962,391 strings.

Page 52: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

Memory Usage""

"A" "B"

"AA" "AB" "BA" "BB"

"AAA" "AAB" "ABA" "ABB" "BAA" "BAB" "BBA" "BBB"

Page 53: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

Memory Usage""

"A" "B"

"AA" "AB" "BA" "BB"

"AAA" "AAB" "ABA" "ABB" "BAA" "BAB" "BBA" "BBB"

Page 54: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

Memory Usage""

"A" "B"

"AA" "AB" "BA" "BB"

"AAA" "AAB" "ABA" "ABB" "BAA" "BAB" "BBA" "BBB"

""

Page 55: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

Memory Usage""

"A" "B"

"AA" "AB" "BA" "BB"

"AAA" "AAB" "ABA" "ABB" "BAA" "BAB" "BBA" "BBB"

"A" "B"

Page 56: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

Memory Usage""

"A" "B"

"AA" "AB" "BA" "BB"

"AAA" "AAB" "ABA" "ABB" "BAA" "BAB" "BBA" "BBB"

"AA" "AB" "BA" "BB"

Page 57: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

Memory Usage""

"A" "B"

"AA" "AB" "BA" "BB"

"AAA" "AAB" "ABA" "ABB" "BAA" "BAB" "BBA" "BBB"

"AAA""AAB""ABA""ABB""BAA""BAB""BBA""BBB"

Page 58: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

Memory Usage

● Our current brute-force attack requires us to have about 26n strings in memory when attacking a password of length n.

● When n gets large, this is an enormous amount of memory.

● On a computer with only 4GB or 8GB of memory, we might run out of memory trying to do a brute-force attack!

Page 59: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approach

""

"A" "B"

"AA" "AB" "BA" "BB"

"AAA" "AAB" "ABA" "ABB" "BAA" "BAB" "BBA" "BBB""BBB"

Page 60: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approach

""

"A" "B"

"AA" "AB" "BA" "BB"

"AAA" "AAB" "ABA" "ABB" "BAA" "BAB" "BBA" "BBB""BBB"

Page 61: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approach

""

"A" "B"

"AA" "AB" "BA" "BB"

"AAA" "AAB" "ABA" "ABB" "BAA" "BAB" "BBA" "BBB""BBB"

Page 62: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approach

""

"A" "B"

"AA" "AB" "BA" "BB"

"AAA" "AAB" "ABA" "ABB" "BAA" "BAB" "BBA" "BBB""BBB"

Page 63: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

recursive-search(Pseudocode)

Page 64: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

recursive-search.cpp(Computer)

Page 65: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approach

Page 66: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"" maxLengthsoFar

Page 67: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"" maxLengthsoFar

Page 68: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"" maxLengthsoFar

""

Page 69: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"" maxLengthsoFar

""

Page 70: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"" maxLengthsoFar

""

Page 71: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"" maxLengthsoFar

""

Page 72: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"A" maxLengthsoFar

""

Page 73: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"A" maxLengthsoFar

""

Page 74: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"A" maxLengthsoFar

""

"A"

Page 75: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"A" maxLengthsoFar

""

"A"

Page 76: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"A" maxLengthsoFar

""

"A"

Page 77: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"A" maxLengthsoFar

""

"A"

Page 78: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"A" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"AA" maxLengthsoFar

""

"A"

Page 79: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"A" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"AA" maxLengthsoFar

""

"A"

Page 80: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"A" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"AA" maxLengthsoFar

""

"A"

"AA"

Page 81: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"A" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"AA" maxLengthsoFar

""

"A"

"AA"

Page 82: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"A" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"AA" maxLengthsoFar

""

"A"

"AA"

Page 83: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"A" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"AA" maxLengthsoFar

""

"A"

"AA"

Page 84: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"A" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"AA" maxLengthsoFar

""

"A"

"AA"

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"AAA" maxLengthsoFar

Page 85: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"A" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"AA" maxLengthsoFar

""

"A"

"AA"

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"AAA" maxLengthsoFar

Page 86: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"A" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"AA" maxLengthsoFar

""

"A"

"AA"

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"AAA" maxLengthsoFar

"AAA"

Page 87: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"A" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"AA" maxLengthsoFar

""

"A"

"AA"

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"AAA" maxLengthsoFar

"AAA"

Page 88: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"A" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"AA" maxLengthsoFar

""

"A"

"AA"

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"AAA" maxLengthsoFar

"AAA"

Page 89: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"A" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"AA" maxLengthsoFar

""

"A"

"AA"

"AAA"

Page 90: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"A" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"AA" maxLengthsoFar

""

"A"

"AA"

"AAA"

Page 91: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"A" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"AA" maxLengthsoFar

""

"A"

"AA"

"AAA"

Page 92: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"A" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"AA" maxLengthsoFar

""

"A"

"AA"

"AAA"

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"AAB" maxLengthsoFar

Page 93: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"A" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"AA" maxLengthsoFar

""

"A"

"AA"

"AAA"

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"AAB" maxLengthsoFar

Page 94: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"A" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"AA" maxLengthsoFar

""

"A"

"AA"

"AAA"

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"AAB" maxLengthsoFar

"AAB"

Page 95: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"A" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"AA" maxLengthsoFar

""

"A"

"AA"

"AAA"

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"AAB" maxLengthsoFar

"AAB"

Page 96: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"A" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"AA" maxLengthsoFar

""

"A"

"AA"

"AAA"

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"AAB" maxLengthsoFar

"AAB"

Page 97: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"A" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"AA" maxLengthsoFar

""

"A"

"AA"

"AAA" "AAB"

Page 98: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"A" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"AA" maxLengthsoFar

""

"A"

"AA"

"AAA" "AAB"

Page 99: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"A" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"AA" maxLengthsoFar

""

"A"

"AA"

"AAA" "AAB"

Page 100: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"A" maxLengthsoFar

""

"A"

"AA"

"AAA" "AAB"

Page 101: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"A" maxLengthsoFar

""

"A"

"AA"

"AAA" "AAB"

Page 102: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"A" maxLengthsoFar

""

"A"

"AA"

"AAA" "AAB"

Page 103: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"A" maxLengthsoFar

""

"A"

"AA"

"AAA" "AAB"

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"AB" maxLengthsoFar

Page 104: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"A" maxLengthsoFar

""

"A"

"AA"

"AAA" "AAB"

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"AB" maxLengthsoFar

Page 105: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"A" maxLengthsoFar

""

"A"

"AA"

"AAA" "AAB"

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"AB" maxLengthsoFar

"AB"

Page 106: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"A" maxLengthsoFar

""

"A"

"AA"

"AAA" "AAB"

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"AB" maxLengthsoFar

"AB"

Page 107: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"A" maxLengthsoFar

""

"A"

"AA"

"AAA" "AAB"

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"AB" maxLengthsoFar

"AB"

Page 108: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"A" maxLengthsoFar

""

"A"

"AA"

"AAA" "AAB"

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"AB" maxLengthsoFar

"AB"

Page 109: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"A" maxLengthsoFar

""

"A"

"AA"

"AAA" "AAB"

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"AB" maxLengthsoFar

"AB"

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"ABA" maxLengthsoFar

Page 110: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"A" maxLengthsoFar

""

"A"

"AA"

"AAA" "AAB"

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"AB" maxLengthsoFar

"AB"

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"ABA" maxLengthsoFar

Page 111: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"A" maxLengthsoFar

""

"A"

"AA"

"AAA" "AAB"

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"AB" maxLengthsoFar

"AB"

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"ABA" maxLengthsoFar

"ABA"

Page 112: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"A" maxLengthsoFar

""

"A"

"AA"

"AAA" "AAB"

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"AB" maxLengthsoFar

"AB"

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"ABA" maxLengthsoFar

"ABA"

Page 113: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"A" maxLengthsoFar

""

"A"

"AA"

"AAA" "AAB"

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"AB" maxLengthsoFar

"AB"

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"ABA" maxLengthsoFar

"ABA"

Page 114: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"A" maxLengthsoFar

""

"A"

"AA"

"AAA" "AAB"

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"AB" maxLengthsoFar

"AB"

"ABA"

Page 115: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"A" maxLengthsoFar

""

"A"

"AA"

"AAA" "AAB"

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"AB" maxLengthsoFar

"AB"

"ABA"

Page 116: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"A" maxLengthsoFar

""

"A"

"AA"

"AAA" "AAB"

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"AB" maxLengthsoFar

"AB"

"ABA"

Page 117: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"A" maxLengthsoFar

""

"A"

"AA"

"AAA" "AAB"

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"AB" maxLengthsoFar

"AB"

"ABA"

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"ABB" maxLengthsoFar

Page 118: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"A" maxLengthsoFar

""

"A"

"AA"

"AAA" "AAB"

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"AB" maxLengthsoFar

"AB"

"ABA"

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"ABB" maxLengthsoFar

Page 119: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"A" maxLengthsoFar

""

"A"

"AA"

"AAA" "AAB"

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"AB" maxLengthsoFar

"AB"

"ABA"

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"ABB" maxLengthsoFar

"ABB"

Page 120: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"A" maxLengthsoFar

""

"A"

"AA"

"AAA" "AAB"

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"AB" maxLengthsoFar

"AB"

"ABA"

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"ABB" maxLengthsoFar

"ABB"

Page 121: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"A" maxLengthsoFar

""

"A"

"AA"

"AAA" "AAB"

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"AB" maxLengthsoFar

"AB"

"ABA"

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"ABB" maxLengthsoFar

"ABB"

Page 122: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"A" maxLengthsoFar

""

"A"

"AA"

"AAA" "AAB"

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"AB" maxLengthsoFar

"AB"

"ABA" "ABB"

Page 123: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"A" maxLengthsoFar

""

"A"

"AA"

"AAA" "AAB"

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"AB" maxLengthsoFar

"AB"

"ABA" "ABB"

Page 124: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"A" maxLengthsoFar

""

"A"

"AA"

"AAA" "AAB"

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"AB" maxLengthsoFar

"AB"

"ABA" "ABB"

Page 125: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"A" maxLengthsoFar

""

"A"

"AA"

"AAA" "AAB"

"AB"

"ABA" "ABB"

Page 126: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"A" maxLengthsoFar

""

"A"

"AA"

"AAA" "AAB"

"AB"

"ABA" "ABB"

Page 127: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"A" maxLengthsoFar

""

"A"

"AA"

"AAA" "AAB"

"AB"

"ABA" "ABB"

Page 128: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"" maxLengthsoFar

""

"A"

"AA"

"AAA" "AAB"

"AB"

"ABA" "ABB"

Page 129: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"" maxLengthsoFar

""

"A"

"AA"

"AAA" "AAB"

"AB"

"ABA" "ABB"

Page 130: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"" maxLengthsoFar

""

"A"

"AA"

"AAA" "AAB"

"AB"

"ABA" "ABB"

Page 131: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Recursive Approachvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"" maxLengthsoFar

""

"A"

"AA"

"AAA" "AAB"

"AB"

"ABA" "ABB"

...

Page 132: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

Why This Matters

Page 133: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

Why This Mattersvoid generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"" maxLengthsoFar

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"A" maxLengthsoFar

""

"A"

"AA"

"AAA" "AAB"

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(length, soFar + ch);

}

}

}3"AB" maxLengthsoFar

"AB"

"ABA"

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}

void generate(string soFar, int maxLength) {

doSomethingWith(soFar);

if (soFar.length() < maxLength) {

for (char ch = 'A'; ch <= 'B'; ch++) {

generate(soFar + ch, maxLength);

}

}

}3"ABB" maxLengthsoFar

"ABB"

Page 134: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Comparison

● Queue-based approach:

● Time: ≈26n+1

● Space: ≈26n+1

● This algorithm is called breadth-first search (or just BFS).

● Although less useful here, BFS has many applications; you'll see one in Assignment 2.

● Recursive approach:● Time: ≈26n+1

● Space: ≈n● This algorithm is called

depth-first search (or just DFS).

● Also quite useful; we'll see more applications later on.

Page 135: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

A Comparison

● Why would we ever use the Queue-based approach

● Remember the Queue approach visits strings in order of length

● What if there are multiple answers to a question, and we want to find the shortest?

– This is what you'll be doing for Assignment 2● What if know ahead of time that shorter

answers are more likely?

Page 136: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

Dictionary Attacks

● Passwords are not random strings; people often use

● words from the dictionary,● simple combinations of numbers,● their birthdays,● etc.

● A dictionary attack is an attack on a password system in which the attacker runs through a list of likely password candidates to try to break in.

● Watch how easy this is...

Page 137: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

dictionary-attack.cpp(Computer)

Page 138: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

Vector or Queue?

● Similar to the Stack, anytime we use a Queue we can use a Vector instead.

● What are the advantages of using a Queue instead of a Vector?

● We have the same two advantages as the Stack:● Easier to read● Protects against programmer mistakes

● Surprisingly, Queues also have a speed advantage

Page 139: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

queue-speed-test.cpp

Page 140: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

Vector or Queue?

● Why is the Queue so much faster?● Intuition: When removing to the beginning of

the Vector all the existing elements need to “slide over”

● Somehow the Queue doesn't do this. We'll find out how in a couple weeks.

Page 141: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

Password.txt

● Hey Aubrey, isn't storing a bunch of passwords in a text file kinda unsafe?● It's extremely unsafe.● In a couple weeks we'll cover a technique

that allows us to store passwords in a much more safe manner.

Page 142: Collections, Part Fourweb.stanford.edu/class/archive/cs/cs106b/cs106b.1138/lectures/06/... · Announcements Remember to send the introductory email from assignment 1 and cc me. I'm

Next Time

● Thinking Recursively● How can you best solve problems using

recursion?● What techniques are necessary to do so?● And what problems yield easily to a

recursive solution?