thinking recursively - stanford...
TRANSCRIPT
![Page 1: Thinking Recursively - Stanford Universityweb.stanford.edu/class/archive/cs/cs106b/cs106b.1204/... · 2020. 1. 28. · Outline for Today Recap from Last Time Where are we, again?](https://reader033.vdocuments.site/reader033/viewer/2022060714/607a6dd15ffec91b1703c803/html5/thumbnails/1.jpg)
Thinking RecursivelyPart III
![Page 2: Thinking Recursively - Stanford Universityweb.stanford.edu/class/archive/cs/cs106b/cs106b.1204/... · 2020. 1. 28. · Outline for Today Recap from Last Time Where are we, again?](https://reader033.vdocuments.site/reader033/viewer/2022060714/607a6dd15ffec91b1703c803/html5/thumbnails/2.jpg)
Outline for Today
● Recap from Last Time● Where are we, again?
● Iteration + Recursion● Combining two techniques together.
● Enumerating Permutations● What order should we do things?
● Enumeration, Generally● How to think about enumeration problems.
![Page 3: Thinking Recursively - Stanford Universityweb.stanford.edu/class/archive/cs/cs106b/cs106b.1204/... · 2020. 1. 28. · Outline for Today Recap from Last Time Where are we, again?](https://reader033.vdocuments.site/reader033/viewer/2022060714/607a6dd15ffec91b1703c803/html5/thumbnails/3.jpg)
Recap from Last Time
![Page 4: Thinking Recursively - Stanford Universityweb.stanford.edu/class/archive/cs/cs106b/cs106b.1204/... · 2020. 1. 28. · Outline for Today Recap from Last Time Where are we, again?](https://reader033.vdocuments.site/reader033/viewer/2022060714/607a6dd15ffec91b1703c803/html5/thumbnails/4.jpg)
A?
I?
{A,H,I} {A, H} {A, I} {A} {H, I} {H} {I} { }
I? I? I?
H? H?
✓ ×
✓
✓
✓ ✓ ✓ × × ×
× × ✓
×
List all subsets of{A, H, I}
List all subsets of{A, H, I}
{A, H} {A} {H} { }
{A} { }
{ }
This is called adecision tree.
This is called adecision tree.
![Page 5: Thinking Recursively - Stanford Universityweb.stanford.edu/class/archive/cs/cs106b/cs106b.1204/... · 2020. 1. 28. · Outline for Today Recap from Last Time Where are we, again?](https://reader033.vdocuments.site/reader033/viewer/2022060714/607a6dd15ffec91b1703c803/html5/thumbnails/5.jpg)
void listSubsetsRec(const HashSet<int>& elems, const HashSet<int>& chosen) { if (elems.isEmpty()) { cout << chosen << endl; } else { int elem = elems.first(); HashSet<int> remaining = elems - elem;
/* Option 1: Include this element. */ listSubsetsRec(remaining, chosen + elem);
/* Option 2: Exclude this element. */ listSubsetsRec(remaining, chosen); }}
Decisions yet to be
made
Decisions yet to be
made
Decisions already made
Decisions already made
Base Case: No decisions
remain.
Base Case: No decisions
remain.
Recursive Case: Try all options for the next decision.
Recursive Case: Try all options for the next decision.
![Page 6: Thinking Recursively - Stanford Universityweb.stanford.edu/class/archive/cs/cs106b/cs106b.1204/... · 2020. 1. 28. · Outline for Today Recap from Last Time Where are we, again?](https://reader033.vdocuments.site/reader033/viewer/2022060714/607a6dd15ffec91b1703c803/html5/thumbnails/6.jpg)
Base Case: No decisions
remain.
Base Case: No decisions
remain.
HashSet<string> subsetsRec(const string& str, const string& chosen) { if (str == "") { return { chosen }; } else { string remaining = str.substr(1); /* Either include the first character, or don't. */ return subsetsRec(remaining, chosen + str[0]) + subsetsRec(remaining, chosen); }}
Decisions yet to be
made
Decisions yet to be
made
Decisions already made
Decisions already made
Recursive Case: Try all options for the next decision.
Recursive Case: Try all options for the next decision.
![Page 7: Thinking Recursively - Stanford Universityweb.stanford.edu/class/archive/cs/cs106b/cs106b.1204/... · 2020. 1. 28. · Outline for Today Recap from Last Time Where are we, again?](https://reader033.vdocuments.site/reader033/viewer/2022060714/607a6dd15ffec91b1703c803/html5/thumbnails/7.jpg)
New Stuff!
![Page 8: Thinking Recursively - Stanford Universityweb.stanford.edu/class/archive/cs/cs106b/cs106b.1204/... · 2020. 1. 28. · Outline for Today Recap from Last Time Where are we, again?](https://reader033.vdocuments.site/reader033/viewer/2022060714/607a6dd15ffec91b1703c803/html5/thumbnails/8.jpg)
More On Self-Similarity
![Page 9: Thinking Recursively - Stanford Universityweb.stanford.edu/class/archive/cs/cs106b/cs106b.1204/... · 2020. 1. 28. · Outline for Today Recap from Last Time Where are we, again?](https://reader033.vdocuments.site/reader033/viewer/2022060714/607a6dd15ffec91b1703c803/html5/thumbnails/9.jpg)
This self-similar shape is called a
Sierpinski carpet.
This self-similar shape is called a
Sierpinski carpet.
![Page 10: Thinking Recursively - Stanford Universityweb.stanford.edu/class/archive/cs/cs106b/cs106b.1204/... · 2020. 1. 28. · Outline for Today Recap from Last Time Where are we, again?](https://reader033.vdocuments.site/reader033/viewer/2022060714/607a6dd15ffec91b1703c803/html5/thumbnails/10.jpg)
An order-0 Sierpinski carpet is a filled square.
An order-0 Sierpinski carpet is a filled square.
![Page 11: Thinking Recursively - Stanford Universityweb.stanford.edu/class/archive/cs/cs106b/cs106b.1204/... · 2020. 1. 28. · Outline for Today Recap from Last Time Where are we, again?](https://reader033.vdocuments.site/reader033/viewer/2022060714/607a6dd15ffec91b1703c803/html5/thumbnails/11.jpg)
Otherwise, a Sierpinski carpet is
eight smaller carpets arranged in this grid
pattern.
Otherwise, a Sierpinski carpet is
eight smaller carpets arranged in this grid
pattern.
![Page 12: Thinking Recursively - Stanford Universityweb.stanford.edu/class/archive/cs/cs106b/cs106b.1204/... · 2020. 1. 28. · Outline for Today Recap from Last Time Where are we, again?](https://reader033.vdocuments.site/reader033/viewer/2022060714/607a6dd15ffec91b1703c803/html5/thumbnails/12.jpg)
(0, 1) (0, 2)(0, 0)
(1, 2)(1, 0)
(2, 1) (2, 2)(2, 0)
(1, 0)
Label each square with its (row, col).
Label each square with its (row, col).
![Page 13: Thinking Recursively - Stanford Universityweb.stanford.edu/class/archive/cs/cs106b/cs106b.1204/... · 2020. 1. 28. · Outline for Today Recap from Last Time Where are we, again?](https://reader033.vdocuments.site/reader033/viewer/2022060714/607a6dd15ffec91b1703c803/html5/thumbnails/13.jpg)
(0, 1) (0, 2)(0, 0)
(1, 2)(1, 0)
(2, 1) (2, 2)(2, 0)
(1, 0)
We can visit each spot with a double
for loop.
We can visit each spot with a double
for loop.
![Page 14: Thinking Recursively - Stanford Universityweb.stanford.edu/class/archive/cs/cs106b/cs106b.1204/... · 2020. 1. 28. · Outline for Today Recap from Last Time Where are we, again?](https://reader033.vdocuments.site/reader033/viewer/2022060714/607a6dd15ffec91b1703c803/html5/thumbnails/14.jpg)
Iteration + Recursion
● It’s completely reasonable to mix iteration and recursion in the same function.
● Here, we’re firing off eight recursive calls, and the easiest way to do that is with a double for loop.
● Recursion doesn’t mean “the absence of iteration.” It just means “solving a problem by solving smaller copies of that same problem.”
![Page 15: Thinking Recursively - Stanford Universityweb.stanford.edu/class/archive/cs/cs106b/cs106b.1204/... · 2020. 1. 28. · Outline for Today Recap from Last Time Where are we, again?](https://reader033.vdocuments.site/reader033/viewer/2022060714/607a6dd15ffec91b1703c803/html5/thumbnails/15.jpg)
(And, just for fun…)
![Page 17: Thinking Recursively - Stanford Universityweb.stanford.edu/class/archive/cs/cs106b/cs106b.1204/... · 2020. 1. 28. · Outline for Today Recap from Last Time Where are we, again?](https://reader033.vdocuments.site/reader033/viewer/2022060714/607a6dd15ffec91b1703c803/html5/thumbnails/17.jpg)
Enumerating Permutations
![Page 18: Thinking Recursively - Stanford Universityweb.stanford.edu/class/archive/cs/cs106b/cs106b.1204/... · 2020. 1. 28. · Outline for Today Recap from Last Time Where are we, again?](https://reader033.vdocuments.site/reader033/viewer/2022060714/607a6dd15ffec91b1703c803/html5/thumbnails/18.jpg)
Permutations
● A permutation of a sequence is a sequence with the same elements, though possibly in a different order.
● For example:● E Pluribus Unum● E Unum Pluribus● Pluribus E Unum● Pluribus Unum E● Unum E Pluribus● Unum Pluribus E
![Page 19: Thinking Recursively - Stanford Universityweb.stanford.edu/class/archive/cs/cs106b/cs106b.1204/... · 2020. 1. 28. · Outline for Today Recap from Last Time Where are we, again?](https://reader033.vdocuments.site/reader033/viewer/2022060714/607a6dd15ffec91b1703c803/html5/thumbnails/19.jpg)
A?
I?
{A,H,I} {A, H} {A, I} {A} {H, I} {H} {I} { }
I? I? I?
H? H?
✓ ×
✓
✓
✓ ✓ ✓ × × ×
× × ✓
×
List all subsets of{A, H, I}
List all subsets of{A, H, I}
{A, H} {A} {H} { }
{A} { }
{ }
Each decision is of the form “do I pick
this element?”
Each decision is of the form “do I pick
this element?”
![Page 20: Thinking Recursively - Stanford Universityweb.stanford.edu/class/archive/cs/cs106b/cs106b.1204/... · 2020. 1. 28. · Outline for Today Recap from Last Time Where are we, again?](https://reader033.vdocuments.site/reader033/viewer/2022060714/607a6dd15ffec91b1703c803/html5/thumbnails/20.jpg)
List all permutations of{A, H, I}
List all permutations of{A, H, I}
Each decision is of the form “what do I
pick next?”
Each decision is of the form “what do I
pick next?”
I
AHI AIH HAI HIA IAH IHA
H I A H A
HI AI AH
AHI
I I
I
H H
H
A A
A I I A H
A
H
"AH" "AI" "HA" "HI" "IA" "IH"
"A" "H" "I"
""
![Page 21: Thinking Recursively - Stanford Universityweb.stanford.edu/class/archive/cs/cs106b/cs106b.1204/... · 2020. 1. 28. · Outline for Today Recap from Last Time Where are we, again?](https://reader033.vdocuments.site/reader033/viewer/2022060714/607a6dd15ffec91b1703c803/html5/thumbnails/21.jpg)
void listPermutationsRec(const string& str, const string& chosen) {
if (str == "") { cout << chosen << endl; } else { /* Try all options of what’s next. */ for (int i = 0; i < str.size(); i++) { char ch = str[i]; string remaining = str.substr(0, i) + str.substr(i + 1); listPermutationsRec(remaining, chosen + ch); }}
Decisions yet to be
made
Decisions yet to be
made
Decisions already made
Decisions already made
Base Case: No decisions
remain.
Base Case: No decisions
remain.
Recursive Case: Try all options for the next decision.
Recursive Case: Try all options for the next decision.
![Page 22: Thinking Recursively - Stanford Universityweb.stanford.edu/class/archive/cs/cs106b/cs106b.1204/... · 2020. 1. 28. · Outline for Today Recap from Last Time Where are we, again?](https://reader033.vdocuments.site/reader033/viewer/2022060714/607a6dd15ffec91b1703c803/html5/thumbnails/22.jpg)
void listSubsetsRec(const HashSet<int>& elems, const HashSet<int>& chosen) { if (elems.isEmpty()) { cout << chosen << endl; } else { int elem = elems.first(); HashSet<int> remaining = elems - elem;
/* Option 1: Include this element. */ listSubsetsRec(remaining, chosen + elem);
/* Option 2: Exclude this element. */ listSubsetsRec(remaining, chosen); }}
Decisions yet to be
made
Decisions yet to be
made
Decisions already made
Decisions already made
Base Case: No decisions
remain.
Base Case: No decisions
remain.
Recursive Case: Try all options for the next decision.
Recursive Case: Try all options for the next decision.
![Page 23: Thinking Recursively - Stanford Universityweb.stanford.edu/class/archive/cs/cs106b/cs106b.1204/... · 2020. 1. 28. · Outline for Today Recap from Last Time Where are we, again?](https://reader033.vdocuments.site/reader033/viewer/2022060714/607a6dd15ffec91b1703c803/html5/thumbnails/23.jpg)
void exploreRec(decisions remaining, decisions already made) {
if (no decisions remain) { process decisions made; } else { for (each possible next choice) { exploreRec(all remaining decisions, decisions made + that choice); } }}
void exploreAllTheThings(initial state) { exploreRec(initial state, no decisions made);}
Decisions yet to be
made
Decisions yet to be
made
Decisions already made
Decisions already made
Base Case: No decisions remain.
Base Case: No decisions remain.
Recursive Case: Try all options for the next decision.
Recursive Case: Try all options for the next decision.
![Page 24: Thinking Recursively - Stanford Universityweb.stanford.edu/class/archive/cs/cs106b/cs106b.1204/... · 2020. 1. 28. · Outline for Today Recap from Last Time Where are we, again?](https://reader033.vdocuments.site/reader033/viewer/2022060714/607a6dd15ffec91b1703c803/html5/thumbnails/24.jpg)
Your Action Items
● Read Chapter 8● There are so many goodies there, and it’s a great
way to complement what we’re discussing here.● Work on Assignment 3
● If you’re following our recommended timetable, you should have completed the Sierpinski Triangle and Human Pyramids and have started on What Are YOU Doing?
● Aim to complete What Are YOU Doing? and to start Shift Scheduling by next time.
![Page 25: Thinking Recursively - Stanford Universityweb.stanford.edu/class/archive/cs/cs106b/cs106b.1204/... · 2020. 1. 28. · Outline for Today Recap from Last Time Where are we, again?](https://reader033.vdocuments.site/reader033/viewer/2022060714/607a6dd15ffec91b1703c803/html5/thumbnails/25.jpg)
Next Time
● Enumerating Combinations● Can you build the Dream Team?
● Recursive Backtracking● Finding a needle in a haystack.
● The Great Shrinkable Word Problem● A fun language exercise with a cute
backstory.