Programming Abstraction in C++ - McMaster University › ~qiao › courses › cs2so3 › slides ›...
Transcript of Programming Abstraction in C++ - McMaster University › ~qiao › courses › cs2so3 › slides ›...
![Page 1: Programming Abstraction in C++ - McMaster University › ~qiao › courses › cs2so3 › slides › ch06.pdfProgramming Abstraction in C++ Eric S. Roberts and Julie Zelenski Stanford](https://reader033.fdocuments.us/reader033/viewer/2022060402/5f0e69317e708231d43f1d42/html5/thumbnails/1.jpg)
Tower of Hanoi Generating Permutations
Programming Abstraction in C++
Eric S. Roberts and Julie Zelenski
Stanford University2010
![Page 2: Programming Abstraction in C++ - McMaster University › ~qiao › courses › cs2so3 › slides › ch06.pdfProgramming Abstraction in C++ Eric S. Roberts and Julie Zelenski Stanford](https://reader033.fdocuments.us/reader033/viewer/2022060402/5f0e69317e708231d43f1d42/html5/thumbnails/2.jpg)
Tower of Hanoi Generating Permutations
Chapter 6. Recursive Procedures
![Page 3: Programming Abstraction in C++ - McMaster University › ~qiao › courses › cs2so3 › slides › ch06.pdfProgramming Abstraction in C++ Eric S. Roberts and Julie Zelenski Stanford](https://reader033.fdocuments.us/reader033/viewer/2022060402/5f0e69317e708231d43f1d42/html5/thumbnails/3.jpg)
Tower of Hanoi Generating Permutations
Outline
1 Tower of Hanoi
2 Generating Permutations
![Page 4: Programming Abstraction in C++ - McMaster University › ~qiao › courses › cs2so3 › slides › ch06.pdfProgramming Abstraction in C++ Eric S. Roberts and Julie Zelenski Stanford](https://reader033.fdocuments.us/reader033/viewer/2022060402/5f0e69317e708231d43f1d42/html5/thumbnails/4.jpg)
Tower of Hanoi Generating Permutations
Introduction
So far the problems are simple. Most of them, like factorial andFibonacci sequence, can be solved by iterative method. Whyrecurssion?
![Page 5: Programming Abstraction in C++ - McMaster University › ~qiao › courses › cs2so3 › slides › ch06.pdfProgramming Abstraction in C++ Eric S. Roberts and Julie Zelenski Stanford](https://reader033.fdocuments.us/reader033/viewer/2022060402/5f0e69317e708231d43f1d42/html5/thumbnails/5.jpg)
Tower of Hanoi Generating Permutations
Introduction
So far the problems are simple. Most of them, like factorial andFibonacci sequence, can be solved by iterative method. Whyrecurssion?
We will solve some complex problems, very difficult to solveusing iterative technique, whereas recursion provides elegantsolutions.
![Page 6: Programming Abstraction in C++ - McMaster University › ~qiao › courses › cs2so3 › slides › ch06.pdfProgramming Abstraction in C++ Eric S. Roberts and Julie Zelenski Stanford](https://reader033.fdocuments.us/reader033/viewer/2022060402/5f0e69317e708231d43f1d42/html5/thumbnails/6.jpg)
Tower of Hanoi Generating Permutations
Introduction
So far the problems are simple. Most of them, like factorial andFibonacci sequence, can be solved by iterative method. Whyrecurssion?
We will solve some complex problems, very difficult to solveusing iterative technique, whereas recursion provides elegantsolutions.
Key. Decompose a problem to a smaller one of the same form,then apply the recursive leap of faith.
![Page 7: Programming Abstraction in C++ - McMaster University › ~qiao › courses › cs2so3 › slides › ch06.pdfProgramming Abstraction in C++ Eric S. Roberts and Julie Zelenski Stanford](https://reader033.fdocuments.us/reader033/viewer/2022060402/5f0e69317e708231d43f1d42/html5/thumbnails/7.jpg)
Tower of Hanoi Generating Permutations
Outline
1 Tower of Hanoi
2 Generating Permutations
![Page 8: Programming Abstraction in C++ - McMaster University › ~qiao › courses › cs2so3 › slides › ch06.pdfProgramming Abstraction in C++ Eric S. Roberts and Julie Zelenski Stanford](https://reader033.fdocuments.us/reader033/viewer/2022060402/5f0e69317e708231d43f1d42/html5/thumbnails/8.jpg)
Tower of Hanoi Generating Permutations
Tower of Hanoi
Function prototype:MoveTower(int n, char start, char finish, char temp);
n: Number of disksstart, finish, temp: Three spires.
Rules1 You can only move one disk at a time.2 You are not allowed to move a larger disk on top of a
smaller disk.
![Page 9: Programming Abstraction in C++ - McMaster University › ~qiao › courses › cs2so3 › slides › ch06.pdfProgramming Abstraction in C++ Eric S. Roberts and Julie Zelenski Stanford](https://reader033.fdocuments.us/reader033/viewer/2022060402/5f0e69317e708231d43f1d42/html5/thumbnails/9.jpg)
Tower of Hanoi Generating Permutations
Applying the recursive leap of faith
The case of n.
Suppose that we have a solution for the problem of smaller sizen − 1 of the same form.
1 Move the top n − 1 disks from start to temp using thesolution for n − 1;
2 Move the disk (largest) from start to finish;3 Move the n − 1 disks from temp to finish using the
solution for n − 1;
![Page 10: Programming Abstraction in C++ - McMaster University › ~qiao › courses › cs2so3 › slides › ch06.pdfProgramming Abstraction in C++ Eric S. Roberts and Julie Zelenski Stanford](https://reader033.fdocuments.us/reader033/viewer/2022060402/5f0e69317e708231d43f1d42/html5/thumbnails/10.jpg)
Tower of Hanoi Generating Permutations
Applying the recursive leap of faith
The case of n.
Suppose that we have a solution for the problem of smaller sizen − 1 of the same form.
1 Move the top n − 1 disks from start to temp using thesolution for n − 1;
2 Move the disk (largest) from start to finish;3 Move the n − 1 disks from temp to finish using the
solution for n − 1;
Stopping point (simple problem).Each time the problem size is reduced by one, eventually thesize is reduced to one. The solution is simple.
void MoveSingleDisk(char start, char finish);
![Page 11: Programming Abstraction in C++ - McMaster University › ~qiao › courses › cs2so3 › slides › ch06.pdfProgramming Abstraction in C++ Eric S. Roberts and Julie Zelenski Stanford](https://reader033.fdocuments.us/reader033/viewer/2022060402/5f0e69317e708231d43f1d42/html5/thumbnails/11.jpg)
Tower of Hanoi Generating Permutations
A recursive algorithm
void MoveTower(int n, char start, char finish, char temp) {if (n == 1) {
MoveSingleDisk(start, finish);} else {
MoveTower(n-1, start, temp, finish);MoveSingleDisk(start, finish);MoveTower(n-1, temp, finish, start);
}}
![Page 12: Programming Abstraction in C++ - McMaster University › ~qiao › courses › cs2so3 › slides › ch06.pdfProgramming Abstraction in C++ Eric S. Roberts and Julie Zelenski Stanford](https://reader033.fdocuments.us/reader033/viewer/2022060402/5f0e69317e708231d43f1d42/html5/thumbnails/12.jpg)
Tower of Hanoi Generating Permutations
A recursive algorithm
void MoveTower(int n, char start, char finish, char temp) {if (n == 1) {
MoveSingleDisk(start, finish);} else {
MoveTower(n-1, start, temp, finish);MoveSingleDisk(start, finish);MoveTower(n-1, temp, finish, start);
}}
Validating the algorithm.
Rule 1 (move one at a time). Only MoveSingleDiskmovesdisk.
Rule 2. When moving the top n − 1 disks, we leave the bottom(largest) disks behind. Any disk put on top of them is smaller.
![Page 13: Programming Abstraction in C++ - McMaster University › ~qiao › courses › cs2so3 › slides › ch06.pdfProgramming Abstraction in C++ Eric S. Roberts and Julie Zelenski Stanford](https://reader033.fdocuments.us/reader033/viewer/2022060402/5f0e69317e708231d43f1d42/html5/thumbnails/13.jpg)
Tower of Hanoi Generating Permutations
A recursive algorithm
void MoveTower(int n, char start, char finish, char temp) {if (n == 1) {
MoveSingleDisk(start, finish);} else {
MoveTower(n-1, start, temp, finish);MoveSingleDisk(start, finish);MoveTower(n-1, temp, finish, start);
}}
Validating the algorithm.
Rule 1 (move one at a time). Only MoveSingleDiskmovesdisk.
Rule 2. When moving the top n − 1 disks, we leave the bottom(largest) disks behind. Any disk put on top of them is smaller.
Still not convinced?
![Page 14: Programming Abstraction in C++ - McMaster University › ~qiao › courses › cs2so3 › slides › ch06.pdfProgramming Abstraction in C++ Eric S. Roberts and Julie Zelenski Stanford](https://reader033.fdocuments.us/reader033/viewer/2022060402/5f0e69317e708231d43f1d42/html5/thumbnails/14.jpg)
Tower of Hanoi Generating Permutations
Tracing the process, n = 3
void MoveTower(int n, char start, char finish, char temp) {if (n == 1) {
MoveSingleDisk(start, finish);} else {
MoveTower(n-1, start, temp, finish);...
}}
n
3
MoveTwer(2, start, temp, finish)n
2
n
1
MoveSingleDisk(start, finish)start
A
return
finishstart temp
CBA
BCA
temp
tempfinishstart
finishstart
CBA
MoveTower
MoveTower
MoveTower
MoveSingleDisk finish
B
MoveTower(1, start, temp, finish)
![Page 15: Programming Abstraction in C++ - McMaster University › ~qiao › courses › cs2so3 › slides › ch06.pdfProgramming Abstraction in C++ Eric S. Roberts and Julie Zelenski Stanford](https://reader033.fdocuments.us/reader033/viewer/2022060402/5f0e69317e708231d43f1d42/html5/thumbnails/15.jpg)
Tower of Hanoi Generating Permutations
Tracing the process (cont.)
void MoveTower(int n, char start, char finish, char temp) {if (n == 1) {
MoveSingleDisk(start, finish);} else {
MoveTower(n-1, start, temp, finish);MoveSingleDisk(start, finish);...
}}
n
3
MoveTwer(2, start, temp, finish)n
2
finishstart temp
CBA
BCA
tempfinishstartMoveTower
MoveSingleDisk(start, finish)start finish
A C
return
MoveSingleDisk
MoveTower
![Page 16: Programming Abstraction in C++ - McMaster University › ~qiao › courses › cs2so3 › slides › ch06.pdfProgramming Abstraction in C++ Eric S. Roberts and Julie Zelenski Stanford](https://reader033.fdocuments.us/reader033/viewer/2022060402/5f0e69317e708231d43f1d42/html5/thumbnails/16.jpg)
Tower of Hanoi Generating Permutations
Tracing the process (cont.)
void MoveTower(int n, char start, char finish, char temp) {if (n == 1) {
MoveSingleDisk(start, finish);} else {
MoveTower(n-1, start, temp, finish);MoveSingleDisk(start, finish);MoveTower(n-1, temp, finish, start);
}}
n
3
MoveTwer(2, start, temp, finish)n
2
n
1
MoveSingleDisk(start, finish)start
return
finishstart temp
CBA
BCA
temp
tempfinishstart
finishstart
MoveTower
MoveTower
MoveTower
MoveSingleDisk finish
MoveTower(1, temp, finish, start)
B C A
B C
![Page 17: Programming Abstraction in C++ - McMaster University › ~qiao › courses › cs2so3 › slides › ch06.pdfProgramming Abstraction in C++ Eric S. Roberts and Julie Zelenski Stanford](https://reader033.fdocuments.us/reader033/viewer/2022060402/5f0e69317e708231d43f1d42/html5/thumbnails/17.jpg)
Tower of Hanoi Generating Permutations
Outline
1 Tower of Hanoi
2 Generating Permutations
![Page 18: Programming Abstraction in C++ - McMaster University › ~qiao › courses › cs2so3 › slides › ch06.pdfProgramming Abstraction in C++ Eric S. Roberts and Julie Zelenski Stanford](https://reader033.fdocuments.us/reader033/viewer/2022060402/5f0e69317e708231d43f1d42/html5/thumbnails/18.jpg)
Tower of Hanoi Generating Permutations
Generating permutations
Function prototype
void ListPermutations(string str);
Example
ABCACBBACBCACABCBA
![Page 19: Programming Abstraction in C++ - McMaster University › ~qiao › courses › cs2so3 › slides › ch06.pdfProgramming Abstraction in C++ Eric S. Roberts and Julie Zelenski Stanford](https://reader033.fdocuments.us/reader033/viewer/2022060402/5f0e69317e708231d43f1d42/html5/thumbnails/19.jpg)
Tower of Hanoi Generating Permutations
Generating permutations (cont.)
For each character in the string, move it to the prefix, thenpermute the rest, a shorter string.
It is convenient to set up two strings: prefix and rest,initially, an empty prefix.
![Page 20: Programming Abstraction in C++ - McMaster University › ~qiao › courses › cs2so3 › slides › ch06.pdfProgramming Abstraction in C++ Eric S. Roberts and Julie Zelenski Stanford](https://reader033.fdocuments.us/reader033/viewer/2022060402/5f0e69317e708231d43f1d42/html5/thumbnails/20.jpg)
Tower of Hanoi Generating Permutations
Generating permutations (cont.)
For each character in the string, move it to the prefix, thenpermute the rest, a shorter string.
It is convenient to set up two strings: prefix and rest,initially, an empty prefix.
Applying the recursive leap of faith: For a string of length n,suppose we have a solution for a string of length n − 1, then
for each character in the stringremove the character from string andput it in prefix;permute rest (length n − 1);
Stopping point: rest is empty.
![Page 21: Programming Abstraction in C++ - McMaster University › ~qiao › courses › cs2so3 › slides › ch06.pdfProgramming Abstraction in C++ Eric S. Roberts and Julie Zelenski Stanford](https://reader033.fdocuments.us/reader033/viewer/2022060402/5f0e69317e708231d43f1d42/html5/thumbnails/21.jpg)
Tower of Hanoi Generating Permutations
Generating permutations (cont.)
A wrapper:
void ListPermutations(string str) {RecursivePermute("", str);
}
void RecursivePermute(string prefix, string rest) {if (rest == "") {
cout << prefix << endl;} else {
for (int i = 0; i < rest.length(), i++) {string newPrefix = prefix + rest[i];string newRest = rest.substr(0, i)
+ rest.substr(i+1);RecursivePermute(newPrefix, newRest);
}}
}
![Page 22: Programming Abstraction in C++ - McMaster University › ~qiao › courses › cs2so3 › slides › ch06.pdfProgramming Abstraction in C++ Eric S. Roberts and Julie Zelenski Stanford](https://reader033.fdocuments.us/reader033/viewer/2022060402/5f0e69317e708231d43f1d42/html5/thumbnails/22.jpg)
Tower of Hanoi Generating Permutations
Generating permutations (cont.)
A wrapper:
void ListPermutations(string str) {RecursivePermute("", str);
}
void RecursivePermute(string prefix, string rest) {if (rest == "") {
cout << prefix << endl;} else {
for (int i = 0; i < rest.length(), i++) {string newPrefix = prefix + rest[i];string newRest = rest.substr(0, i)
+ rest.substr(i+1);RecursivePermute(newPrefix, newRest);
}}
}
Question: Why the wrapper?