Recursive Thinking
Recursive Thinking
An Interesting Read
http://drtechniko.wordpress.com/2012/04/09/how-to-train-your-robot/
http://www.thisamericanlife.org/radio-
archives/episode/461/take-the-money-
and-run-for-office
Federal Campaign Limits
Source: http://www.fec.gov/pages/brochures/contriblimits.shtml
Federal Campaign Limits
Source: http://www.fec.gov/pages/brochures/contriblimits.shtml
Raising Money
● According to several sources
(Bloomberg, the Wall Street Journal,
Politico, etc.), the 2008 Presidential
Election cost about $1.5 billion.
● How can you raise that much money
from private donors?
Raising Money
$22,500
} else {
Split the problem up into one or more smaller
problems with the same structure as the original.
Solve each of those smaller problems.
Combine the results to get the overall solution.
Return the overall solution.
}
Recursive Problem-Solving
if (n is at most $2,500) {
Donate $n
} else {
Find three other people.
Tell them each to raise $n / 3.
}
What's Going On?
● Recursion solves a problem by
continuously simplifying the problem
until it becomes simple enough to be
solved directly.
● The recursive decomposition makes
the problem slightly simpler at each step.
● The base case is what ultimately makes
the problem solvable – it guarantees that
when the problem is sufficiently simple,
we can just solve it directly.
The Towers of Hanoi Problem
Towers of Hanoi
A B C
Towers of Hanoi
Move
Movethis
thistower...
tower...
A B C
Towers of Hanoi
Move
Movethis
thistower...
tower... ...to
...tothis
thisspindle.
spindle.
A B C
Towers of Hanoi
Move
Movethis
thistower...
tower... ...to
...tothis
thisspindle.
spindle.
A B C
Towers of Hanoi
A B C
Towers of Hanoi
A B C
Towers of Hanoi
A B C
Towers of Hanoi
A B C
Towers of Hanoi
A B C
Towers of Hanoi
A B C
Towers of Hanoi
A B C
Towers of Hanoi
A B C
Towers of Hanoi
A B C
Towers of Hanoi
A B C
Towers of Hanoi
A B C
Towers of Hanoi
A B C
Towers of Hanoi
A B C
Towers of Hanoi
A B C
Towers of Hanoi
A B C
Towers of Hanoi
A B C
Towers of Hanoi
A B C
Towers of Hanoi
A B C
Towers of Hanoi
A B C
Towers of Hanoi
A B C
Towers of Hanoi
A B C
Towers of Hanoi
A B C
Towers of Hanoi
A B C
Towers of Hanoi
A B C
Towers of Hanoi
A B C
Towers of Hanoi
A B C
Towers of Hanoi
A B C
Towers of Hanoi
A B C
Towers of Hanoi
A B C
Towers of Hanoi
A B C
Towers of Hanoi
A B C
Towers of Hanoi
A B C
Towers of Hanoi
A B C
Towers of Hanoi
A B C
Solving the Towers of Hanoi
Solving the Towers of Hanoi
A B C
...needs
...needsto
toget
getover
over
This
Thisdisk...
disk... here.
here.
Solving the Towers of Hanoi
A B C
...needs
...needsto
toget
getover
over
This
Thisdisk...
disk... here.
here.
Solving the Towers of Hanoi
A B C
...needs
...needsto
toget
getover
over
This
Thisdisk...
disk... here.
here.
Solving the Towers of Hanoi
A B C
Solving the Towers of Hanoi
A B C
Solving the Towers of Hanoi
A B C
Solving the Towers of Hanoi
A B C
...needs
...needsto
toget
getover
over
This
Thisdisk...
disk... here.
here.
Solving the Towers of Hanoi
A B C
...needs
...needsto
toget
getover
over
This
Thisdisk...
disk... here.
here.
Solving the Towers of Hanoi
A B C
...needs
...needsto
toget
getover
over
This
Thisdisk...
disk... here.
here.
Solving the Towers of Hanoi
A B C
...needs
...needsto
toget
getover
over
This
Thisdisk...
disk... here.
here.
Solving the Towers of Hanoi
A B C
Solving the Towers of Hanoi
A B C
Solving the Towers of Hanoi
A B C
...needs
...needsto
toget
getover
over
This
Thisdisk...
disk... here.
here.
Solving the Towers of Hanoi
A B C
...needs
...needsto
toget
getover
over
This
Thisdisk...
disk... here.
here.
Solving the Towers of Hanoi
A B C
...needs
...needsto
toget
getover
over
This
Thisdisk...
disk... here.
here.
Solving the Towers of Hanoi
A B C
...needs
...needsto
toget
getover
over
This
Thisdisk...
disk... here.
here.
The Recursive Decomposition
● To get a tower of N+1 disks from spindle
X to spindle Y, using Z as a temporary:
● Recursively move the top N disks from
spindle X to spindle Z, using Y as a
temporary.
● Move the N+1st disk from X to Y.
● Recursively move the N disks from spindle
Z to spindle Y, using X as a temporary.
The Base Case
● We need to find a very simple case that
we can solve directly in order for the
recursion to work.
● If the tower has size one, we can just
move that single disk from the source to
the destination.
And now, the solution...
void moveTower(int n, char from, char to, char temp) {
if (n == 1) {
moveSingleDisk(from, to);
} else {
moveTower(n – 1, from, temp, to);
moveSingleDisk(from, to);
moveTower(n – 1, temp, to, from);
}
}
int
int main()
main() {{
moveTower(3,
moveTower(3, 'a',
'a', 'c',
'c', 'b');
'b');
}}
A B C
int
int main()
main() {{
moveTower(3,
moveTower(3, 'a',
'a', 'c',
'c', 'b');
'b');
}}
A B C
int
int main()
main() {{
moveTower(3,
moveTower(3, 'a',
'a', 'b',
'b', 'c');
'c');
}} void
void moveTower(int n, char from,
moveTower(int n, char from, char
char to,
to, char
char temp)
temp) {{
if
if (n
(n ==
== 1)
1) {{
moveSingleDisk(from,
moveSingleDisk(from, to); to);
}} else {
else {
moveTower(n
moveTower(n –– 1, 1, from,
from, temp,
temp, to);
to);
moveSingleDisk(from,
moveSingleDisk(from, to);to);
moveTower(n
moveTower(n –– 1, 1, temp,
temp, to,
to, from);
from);
}}
}}
n 3 from a to c temp b
A B C
int
int main()
main() {{
moveTower(3,
moveTower(3, 'a',
'a', 'b',
'b', 'c');
'c');
}} void
void moveTower(int n, char from,
moveTower(int n, char from, char
char to,
to, char
char temp)
temp) {{
if
if (n
(n ==
== 1)
1) {{
moveSingleDisk(from,
moveSingleDisk(from, to); to);
}} else {
else {
moveTower(n
moveTower(n –– 1, 1, from,
from, temp,
temp, to);
to);
moveSingleDisk(from,
moveSingleDisk(from, to);to);
moveTower(n
moveTower(n –– 1, 1, temp,
temp, to,
to, from);
from);
}}
}}
n 3 from a to c temp b
A B C
int
int main()
main() {{
moveTower(3,
moveTower(3, 'a',
'a', 'b',
'b', 'c');
'c');
}} void
void moveTower(int n, char from,
moveTower(int n, char from, char
char to,
to, char
char temp)
temp) {{
if
if (n
(n ==
== 1)
1) {{
moveSingleDisk(from,
moveSingleDisk(from, to); to);
}} else {
else {
moveTower(n
moveTower(n –– 1, 1, from,
from, temp,
temp, to);
to);
moveSingleDisk(from,
moveSingleDisk(from, to);to);
moveTower(n
moveTower(n –– 1, 1, temp,
temp, to,
to, from);
from);
}}
}}
n 3 from a to c temp b
A B C
int
int main()
main() {{
moveTower(3,
moveTower(3, 'a',
'a', 'b',
'b', 'c');
'c');
}} void
void moveTower(int n, char from,
moveTower(int n, char from, char
char to,
to, char
char temp)
temp) {{
if
if (n
(n ==
== 1)
1) {{
moveSingleDisk(from,
moveSingleDisk(from, to); to);
}} else {
else {
moveTower(n
moveTower(n –– 1, 1, from,
from, temp,
temp, to);
to);
moveSingleDisk(from,
moveSingleDisk(from, to);to);
moveTower(n
moveTower(n –– 1, 1, temp,
temp, to,
to, from);
from);
}}
}}
n 3 from a to c temp b
A B C
int
int main()
main() {{
moveTower(3,
moveTower(3, 'a',
'a', 'b',
'b', 'c');
'c');
}} void
void moveTower(int n, char from,
moveTower(int n, char from, char
char to,
to, char
char temp)
temp) {{
if
if (n(n ==
== 1)
1) {{
void moveTower(int
voidmoveSingleDisk(from,
moveTower(int n,
n, char
char from,
to);
from, char
char to,
to, char
char temp)
temp) {{
ifmoveSingleDisk(from,
(n == 1) {{ to);
}} else
if {
(n == 1)
else moveSingleDisk(from,
{
moveTower(n – 1, from,
moveSingleDisk(from, to);
temp,
to);to);
moveTower(n –
}moveSingleDisk(from,
else { 1, from, temp, to);
}moveSingleDisk(from,
else { to);
to); temp, to);
moveTower(n
moveTower(n –
moveTower(n 1,– 1, from,
temp,
– temp, to,
1, from, from);
temp,
moveTower(n – 1,
moveSingleDisk(from, to,
to);from);to);
}} moveSingleDisk(from, to);
}} moveTower(n
moveTower(n –– 1, 1, temp,
temp, to,
to, from);
from);
}}
}} n 3 from a to b temp c
n 2 from a to b temp c
A B C
int
int main()
main() {{
moveTower(3,
moveTower(3, 'a',
'a', 'b',
'b', 'c');
'c');
}} void
void moveTower(int n, char from,
moveTower(int n, char from, char
char to,
to, char
char temp)
temp) {{
if
if (n(n ==
== 1)
1) {{
void moveTower(int
voidmoveSingleDisk(from,
moveTower(int n,
n, char
char from,
to);
from, char
char to,
to, char
char temp)
temp) {{
ifmoveSingleDisk(from,
(n == 1) {{ to);
}} else
if {
(n == 1)
else moveSingleDisk(from,
{
moveTower(n – 1, from,
moveSingleDisk(from, to);
temp,
to);to);
moveTower(n –
}moveSingleDisk(from,
else { 1, from, temp, to);
}moveSingleDisk(from,
else { to);
to); temp, to);
moveTower(n
moveTower(n –
moveTower(n 1,– 1, from,
temp,
– temp, to,
1, from, from);
temp,
moveTower(n – 1,
moveSingleDisk(from, to,
to);from);to);
}} moveSingleDisk(from, to);
}} moveTower(n
moveTower(n –– 1, 1, temp,
temp, to,
to, from);
from);
}}
}} n 3 from a to b temp c
n 2 from a to b temp c
A B C
int
int main()
main() {{
moveTower(3,
moveTower(3, 'a',
'a', 'b',
'b', 'c');
'c');
}} void
void moveTower(int n, char from,
moveTower(int n, char from, char
char to,
to, char
char temp)
temp) {{
if
if (n(n ==
== 1)
1) {{
void moveTower(int
voidmoveSingleDisk(from,
moveTower(int n,
n, char
char from,
to);
from, char
char to,
to, char
char temp)
temp) {{
ifmoveSingleDisk(from,
(n == 1) {{ to);
}} else
if {
(n == 1)
else moveSingleDisk(from,
{
moveTower(n – 1, from,
moveSingleDisk(from, to);
temp,
to);to);
moveTower(n –
}moveSingleDisk(from,
else { 1, from, temp, to);
}moveSingleDisk(from,
else { to);
to); temp, to);
moveTower(n
moveTower(n –
moveTower(n 1,– 1, from,
temp,
– temp, to,
1, from, from);
temp,
moveTower(n – 1,
moveSingleDisk(from, to,
to);from);to);
}} moveSingleDisk(from, to);
}} moveTower(n
moveTower(n –– 1, 1, temp,
temp, to,
to, from);
from);
}}
}} n 3 from a to b temp c
n 2 from a to b temp c
A B C
int
int main()
main() {{
moveTower(3,
moveTower(3, 'a',
'a', 'b',
'b', 'c');
'c');
}} void
void moveTower(int n, char from,
moveTower(int n, char from, char
char to,
to, char
char temp)
temp) {{
if
if (n(n ==
== 1)
1) {{
void moveTower(int
voidmoveSingleDisk(from,
moveTower(int n,
n, char
char from,
to);
from, char
char to,
to, char
char temp)
temp) {{
ifmoveSingleDisk(from,
(n == 1) {{ to);
}} else
if {
(n == 1)
else moveSingleDisk(from,
{
moveTower(n – 1, from,
moveSingleDisk(from, to);
temp,
to);to);
moveTower(n –
}moveSingleDisk(from,
else { 1, from, temp, to);
}moveSingleDisk(from,
else { to);
to); temp, to);
moveTower(n
moveTower(n –
moveTower(n 1,– 1, from,
temp,
– temp, to,
1, from, from);
temp,
moveTower(n – 1,
moveSingleDisk(from, to,
to);from);to);
}} moveSingleDisk(from, to);
}} moveTower(n
moveTower(n –– 1, 1, temp,
temp, to,
to, from);
from);
}}
}} n 3 from a to b temp c
n 2 from a to b temp c
A B C
int
int main()
main() {{
moveTower(3,
moveTower(3, 'a',
'a', 'b',
'b', 'c');
'c');
}} void
void moveTower(int n, char from,
moveTower(int n, char from, char
char to,
to, char
char temp)
temp) {{
if
if (n(n ==
== 1)
1) {{
void moveTower(int
voidmoveSingleDisk(from,
moveTower(int n,
n, char
char from,
to);
from, char
char to,
to, char
char temp)
temp) {{
ifmoveSingleDisk(from,
(n == 1) {{ to);
}} else
if {
(n == 1)
else moveSingleDisk(from,
{
void
void moveTower(int
moveTower(int n,
n, char
char from,
to);
from, char
char to,
to, char
char temp)
temp) {{
moveTower(n – 1, from,
moveSingleDisk(from,
moveTower(n – { temp,
1, from, temp, to);
to); to);
if
if (n
{
(n ==
== 1)
}moveSingleDisk(from,
else 1) {
}moveSingleDisk(from,
else moveSingleDisk(from,
{ to);
to); temp,
moveTower(n – 1, from,
moveSingleDisk(from, to);
to);to);
moveTower(n
moveTower(n
moveTower(n –– 1,
1,– temp,
1,
temp, to,
from,
to, from);
temp,
from); to);
}moveSingleDisk(from,
else {
}moveSingleDisk(from,
else { to);
}} to); temp, to);
moveTower(n
moveTower(n
moveTower(n– 1,– 1,
temp,
– temp,from,
1, from,to, from);
temp,
}} moveTower(n – 1,
moveSingleDisk(from, to,
to);from);to);
}} moveSingleDisk(from, to);
}} n 3 from a–– 1,
moveTower(n
moveTower(n
to b
1, temp,
temp, to,
temp c
to, from);
from);
}}
}} n 2 from a to c temp b
n 1 from a to c temp b
A B C
int
int main()
main() {{
moveTower(3,
moveTower(3, 'a',
'a', 'b',
'b', 'c');
'c');
}} void
void moveTower(int n, char from,
moveTower(int n, char from, char
char to,
to, char
char temp)
temp) {{
if
if (n(n ==
== 1)
1) {{
void moveTower(int
voidmoveSingleDisk(from,
moveTower(int n,
n, char
char from,
to);
from, char
char to,
to, char
char temp)
temp) {{
ifmoveSingleDisk(from,
(n == 1) {{ to);
}} else
if {
(n == 1)
else moveSingleDisk(from,
{
void
void moveTower(int
moveTower(int n,
n, char
char from,
to);
from, char
char to,
to, char
char temp)
temp) {{
moveTower(n – 1, from,
moveSingleDisk(from,
moveTower(n – { temp,
1, from, temp, to);
to); to);
if
if (n
{
(n ==
== 1)
}moveSingleDisk(from,
else 1) {
}moveSingleDisk(from,
else moveSingleDisk(from,
{ to);
to); temp,
moveTower(n – 1, from,
moveSingleDisk(from, to);
to);to);
moveTower(n
moveTower(n
moveTower(n –– 1,
1,– temp,
1,
temp, to,
from,
to, from);
temp,
from); to);
}moveSingleDisk(from,
else {
}moveSingleDisk(from,
else { to);
}} to); temp, to);
moveTower(n
moveTower(n
moveTower(n– 1,– 1,
temp,
– temp,from,
1, from,to, from);
temp,
}} moveTower(n – 1,
moveSingleDisk(from, to,
to);from);to);
}} moveSingleDisk(from, to);
}} n 3 from a–– 1,
moveTower(n
moveTower(n
to b
1, temp,
temp, to,
temp c
to, from);
from);
}}
}} n 2 from a to c temp b
n 1 from a to c temp b
A B C
int
int main()
main() {{
moveTower(3,
moveTower(3, 'a',
'a', 'b',
'b', 'c');
'c');
}} void
void moveTower(int n, char from,
moveTower(int n, char from, char
char to,
to, char
char temp)
temp) {{
if
if (n(n ==
== 1)
1) {{
void moveTower(int
voidmoveSingleDisk(from,
moveTower(int n,
n, char
char from,
to);
from, char
char to,
to, char
char temp)
temp) {{
ifmoveSingleDisk(from,
(n == 1) {{ to);
}} else
if {
(n == 1)
else moveSingleDisk(from,
{
void
void moveTower(int
moveTower(int n,
n, char
char from,
to);
from, char
char to,
to, char
char temp)
temp) {{
moveTower(n – 1, from,
moveSingleDisk(from,
moveTower(n – { temp,
1, from, temp, to);
to); to);
if
if (n
{
(n ==
== 1)
}moveSingleDisk(from,
else 1) {
}moveSingleDisk(from,
else moveSingleDisk(from,
{ to);
to); temp,
moveTower(n – 1, from,
moveSingleDisk(from, to);
to);to);
moveTower(n
moveTower(n
moveTower(n –– 1,
1,– temp,
1,
temp, to,
from,
to, from);
temp,
from); to);
}moveSingleDisk(from,
else {
}moveSingleDisk(from,
else { to);
}} to); temp, to);
moveTower(n
moveTower(n
moveTower(n– 1,– 1,
temp,
– temp,from,
1, from,to, from);
temp,
}} moveTower(n – 1,
moveSingleDisk(from, to,
to);from);to);
}} moveSingleDisk(from, to);
}} n 3 from a–– 1,
moveTower(n
moveTower(n
to b
1, temp,
temp, to,
temp c
to, from);
from);
}}
}} n 2 from a to c temp b
n 1 from a to c temp b
A B C
int
int main()
main() {{
moveTower(3,
moveTower(3, 'a',
'a', 'b',
'b', 'c');
'c');
}} void
void moveTower(int n, char from,
moveTower(int n, char from, char
char to,
to, char
char temp)
temp) {{
if
if (n(n ==
== 1)
1) {{
void moveTower(int
voidmoveSingleDisk(from,
moveTower(int n,
n, char
char from,
to);
from, char
char to,
to, char
char temp)
temp) {{
ifmoveSingleDisk(from,
(n == 1) {{ to);
}} else
if {
(n == 1)
else moveSingleDisk(from,
{
void
void moveTower(int
moveTower(int n,
n, char
char from,
to);
from, char
char to,
to, char
char temp)
temp) {{
moveTower(n – 1, from,
moveSingleDisk(from,
moveTower(n – { temp,
1, from, temp, to);
to); to);
if
if (n
{
(n ==
== 1)
}moveSingleDisk(from,
else 1) {
}moveSingleDisk(from,
else moveSingleDisk(from,
{ to);
to); temp,
moveTower(n – 1, from,
moveSingleDisk(from, to);
to);to);
moveTower(n
moveTower(n
moveTower(n –– 1,
1,– temp,
1,
temp, to,
from,
to, from);
temp,
from); to);
}moveSingleDisk(from,
else {
}moveSingleDisk(from,
else { to);
}} to); temp, to);
moveTower(n
moveTower(n
moveTower(n– 1,– 1,
temp,
– temp,from,
1, from,to, from);
temp,
}} moveTower(n – 1,
moveSingleDisk(from, to,
to);from);to);
}} moveSingleDisk(from, to);
}} n 3 from a–– 1,
moveTower(n
moveTower(n
to b
1, temp,
temp, to,
temp c
to, from);
from);
}}
}} n 2 from a to c temp b
n 1 from a to c temp b
A B C
int
int main()
main() {{
moveTower(3,
moveTower(3, 'a',
'a', 'b',
'b', 'c');
'c');
}} void
void moveTower(int n, char from,
moveTower(int n, char from, char
char to,
to, char
char temp)
temp) {{
if
if (n(n ==
== 1)
1) {{
void moveTower(int
voidmoveSingleDisk(from,
moveTower(int n,
n, char
char from,
to);
from, char
char to,
to, char
char temp)
temp) {{
ifmoveSingleDisk(from,
(n == 1) {{ to);
}} else
if {
(n == 1)
else moveSingleDisk(from,
{
moveTower(n – 1, from,
moveSingleDisk(from, to);
temp,
to);to);
moveTower(n –
}moveSingleDisk(from,
else { 1, from, temp, to);
}moveSingleDisk(from,
else { to);
to); temp, to);
moveTower(n
moveTower(n –
moveTower(n 1,– 1, from,
temp,
– temp, to,
1, from, from);
temp,
moveTower(n – 1,
moveSingleDisk(from, to,
to);from);to);
}} moveSingleDisk(from, to);
}} moveTower(n
moveTower(n –– 1, 1, temp,
temp, to,
to, from);
from);
}}
}} n 3 from a to b temp c
n 2 from a to b temp c
A B C
int
int main()
main() {{
moveTower(3,
moveTower(3, 'a',
'a', 'b',
'b', 'c');
'c');
}} void
void moveTower(int n, char from,
moveTower(int n, char from, char
char to,
to, char
char temp)
temp) {{
if
if (n(n ==
== 1)
1) {{
void moveTower(int
voidmoveSingleDisk(from,
moveTower(int n,
n, char
char from,
to);
from, char
char to,
to, char
char temp)
temp) {{
ifmoveSingleDisk(from,
(n == 1) {{ to);
}} else
if {
(n == 1)
else moveSingleDisk(from,
{
moveTower(n – 1, from,
moveSingleDisk(from, to);
temp,
to);to);
moveTower(n –
}moveSingleDisk(from,
else { 1, from, temp, to);
}moveSingleDisk(from,
else { to);
to); temp, to);
moveTower(n
moveTower(n –
moveTower(n 1,– 1, from,
temp,
– temp, to,
1, from, from);
temp,
moveTower(n – 1,
moveSingleDisk(from, to,
to);from);to);
}} moveSingleDisk(from, to);
}} moveTower(n
moveTower(n –– 1, 1, temp,
temp, to,
to, from);
from);
}}
}} n 3 from a to b temp c
n 2 from a to b temp c
A B C
int
int main()
main() {{
moveTower(3,
moveTower(3, 'a',
'a', 'b',
'b', 'c');
'c');
}} void
void moveTower(int n, char from,
moveTower(int n, char from, char
char to,
to, char
char temp)
temp) {{
if
if (n(n ==
== 1)
1) {{
void moveTower(int
voidmoveSingleDisk(from,
moveTower(int n,
n, char
char from,
to);
from, char
char to,
to, char
char temp)
temp) {{
ifmoveSingleDisk(from,
(n == 1) {{ to);
}} else
if {
(n == 1)
else moveSingleDisk(from,
{
moveTower(n – 1, from,
moveSingleDisk(from, to);
temp,
to);to);
moveTower(n –
}moveSingleDisk(from,
else { 1, from, temp, to);
}moveSingleDisk(from,
else { to);
to); temp, to);
moveTower(n
moveTower(n –
moveTower(n 1,– 1, from,
temp,
– temp, to,
1, from, from);
temp,
moveTower(n – 1,
moveSingleDisk(from, to,
to);from);to);
}} moveSingleDisk(from, to);
}} moveTower(n
moveTower(n –– 1, 1, temp,
temp, to,
to, from);
from);
}}
}} n 3 from a to b temp c
n 2 from a to b temp c
A B C
int
int main()
main() {{
moveTower(3,
moveTower(3, 'a',
'a', 'b',
'b', 'c');
'c');
}} void
void moveTower(int n, char from,
moveTower(int n, char from, char
char to,
to, char
char temp)
temp) {{
if
if (n(n ==
== 1)
1) {{
void moveTower(int
voidmoveSingleDisk(from,
moveTower(int n,
n, char
char from,
to);
from, char
char to,
to, char
char temp)
temp) {{
ifmoveSingleDisk(from,
(n == 1) {{ to);
}} else
if {
(n == 1)
else moveSingleDisk(from,
{
moveTower(n – 1, from,
moveSingleDisk(from, to);
temp,
to);to);
moveTower(n –
}moveSingleDisk(from,
else { 1, from, temp, to);
}moveSingleDisk(from,
else { to);
to); temp, to);
moveTower(n
moveTower(n –
moveTower(n 1,– 1, from,
temp,
– temp, to,
1, from, from);
temp,
moveTower(n – 1,
moveSingleDisk(from, to,
to);from);to);
}} moveSingleDisk(from, to);
}} moveTower(n
moveTower(n –– 1, 1, temp,
temp, to,
to, from);
from);
}}
}} n 3 from a to b temp c
n 2 from a to b temp c
A B C
int
int main()
main() {{
moveTower(3,
moveTower(3, 'a',
'a', 'b',
'b', 'c');
'c');
}} void
void moveTower(int n, char from,
moveTower(int n, char from, char
char to,
to, char
char temp)
temp) {{
if
if (n(n ==
== 1)
1) {{
void moveTower(int
voidmoveSingleDisk(from,
moveTower(int n,
n, char
char from,
to);
from, char
char to,
to, char
char temp)
temp) {{
ifmoveSingleDisk(from,
(n == 1) {{ to);
}} else
if {
(n == 1)
else moveSingleDisk(from,
{
void
void moveTower(int
moveTower(int n,
n, char
char from,
to);
from, char
char to,
to, char
char temp)
temp) {{
moveTower(n – 1, from,
moveSingleDisk(from,
moveTower(n – { temp,
1, from, temp, to);
to); to);
if
if (n
{
(n ==
== 1)
}moveSingleDisk(from,
else 1) {
}moveSingleDisk(from,
else moveSingleDisk(from,
{ to);
to); temp,
moveTower(n – 1, from,
moveSingleDisk(from, to);
to);to);
moveTower(n
moveTower(n
moveTower(n –– 1,
1,– temp,
1,
temp, to,
from,
to, from);
temp,
from); to);
}moveSingleDisk(from,
else {
}moveSingleDisk(from,
else { to);
}} to); temp, to);
moveTower(n
moveTower(n
moveTower(n– 1,– 1,
temp,
– temp,from,
1, from,to, from);
temp,
}} moveTower(n – 1,
moveSingleDisk(from, to,
to);from);to);
}} moveSingleDisk(from, to);
}} n 3 from a–– 1,
moveTower(n
moveTower(n
to b
1, temp,
temp, to,
temp c
to, from);
from);
}}
}} n 2 from a to c temp b
n 1 from c to b temp a
A B C
int
int main()
main() {{
moveTower(3,
moveTower(3, 'a',
'a', 'b',
'b', 'c');
'c');
}} void
void moveTower(int n, char from,
moveTower(int n, char from, char
char to,
to, char
char temp)
temp) {{
if
if (n(n ==
== 1)
1) {{
void moveTower(int
voidmoveSingleDisk(from,
moveTower(int n,
n, char
char from,
to);
from, char
char to,
to, char
char temp)
temp) {{
ifmoveSingleDisk(from,
(n == 1) {{ to);
}} else
if {
(n == 1)
else moveSingleDisk(from,
{
void
void moveTower(int
moveTower(int n,
n, char
char from,
to);
from, char
char to,
to, char
char temp)
temp) {{
moveTower(n – 1, from,
moveSingleDisk(from,
moveTower(n – { temp,
1, from, temp, to);
to); to);
if
if (n
{
(n ==
== 1)
}moveSingleDisk(from,
else 1) {
}moveSingleDisk(from,
else moveSingleDisk(from,
{ to);
to); temp,
moveTower(n – 1, from,
moveSingleDisk(from, to);
to);to);
moveTower(n
moveTower(n
moveTower(n –– 1,
1,– temp,
1,
temp, to,
from,
to, from);
temp,
from); to);
}moveSingleDisk(from,
else {
}moveSingleDisk(from,
else { to);
}} to); temp, to);
moveTower(n
moveTower(n
moveTower(n– 1,– 1,
temp,
– temp,from,
1, from,to, from);
temp,
}} moveTower(n – 1,
moveSingleDisk(from, to,
to);from);to);
}} moveSingleDisk(from, to);
}} n 3 from a–– 1,
moveTower(n
moveTower(n
to b
1, temp,
temp, to,
temp c
to, from);
from);
}}
}} n 2 from a to c temp b
n 1 from c to b temp a
A B C
int
int main()
main() {{
moveTower(3,
moveTower(3, 'a',
'a', 'b',
'b', 'c');
'c');
}} void
void moveTower(int n, char from,
moveTower(int n, char from, char
char to,
to, char
char temp)
temp) {{
if
if (n(n ==
== 1)
1) {{
void moveTower(int
voidmoveSingleDisk(from,
moveTower(int n,
n, char
char from,
to);
from, char
char to,
to, char
char temp)
temp) {{
ifmoveSingleDisk(from,
(n == 1) {{ to);
}} else
if {
(n == 1)
else moveSingleDisk(from,
{
void
void moveTower(int
moveTower(int n,
n, char
char from,
to);
from, char
char to,
to, char
char temp)
temp) {{
moveTower(n – 1, from,
moveSingleDisk(from,
moveTower(n – { temp,
1, from, temp, to);
to); to);
if
if (n
{
(n ==
== 1)
}moveSingleDisk(from,
else 1) {
}moveSingleDisk(from,
else moveSingleDisk(from,
{ to);
to); temp,
moveTower(n – 1, from,
moveSingleDisk(from, to);
to);to);
moveTower(n
moveTower(n
moveTower(n –– 1,
1,– temp,
1,
temp, to,
from,
to, from);
temp,
from); to);
}moveSingleDisk(from,
else {
}moveSingleDisk(from,
else { to);
}} to); temp, to);
moveTower(n
moveTower(n
moveTower(n– 1,– 1,
temp,
– temp,from,
1, from,to, from);
temp,
}} moveTower(n – 1,
moveSingleDisk(from, to,
to);from);to);
}} moveSingleDisk(from, to);
}} n 3 from a–– 1,
moveTower(n
moveTower(n
to b
1, temp,
temp, to,
temp c
to, from);
from);
}}
}} n 2 from a to c temp b
n 1 from c to b temp a
A B C
int
int main()
main() {{
moveTower(3,
moveTower(3, 'a',
'a', 'b',
'b', 'c');
'c');
}} void
void moveTower(int n, char from,
moveTower(int n, char from, char
char to,
to, char
char temp)
temp) {{
if
if (n(n ==
== 1)
1) {{
void moveTower(int
voidmoveSingleDisk(from,
moveTower(int n,
n, char
char from,
to);
from, char
char to,
to, char
char temp)
temp) {{
ifmoveSingleDisk(from,
(n == 1) {{ to);
}} else
if {
(n == 1)
else moveSingleDisk(from,
{
void
void moveTower(int
moveTower(int n,
n, char
char from,
to);
from, char
char to,
to, char
char temp)
temp) {{
moveTower(n – 1, from,
moveSingleDisk(from,
moveTower(n – { temp,
1, from, temp, to);
to); to);
if
if (n
{
(n ==
== 1)
}moveSingleDisk(from,
else 1) {
}moveSingleDisk(from,
else moveSingleDisk(from,
{ to);
to); temp,
moveTower(n – 1, from,
moveSingleDisk(from, to);
to);to);
moveTower(n
moveTower(n
moveTower(n –– 1,
1,– temp,
1,
temp, to,
from,
to, from);
temp,
from); to);
}moveSingleDisk(from,
else {
}moveSingleDisk(from,
else { to);
}} to); temp, to);
moveTower(n
moveTower(n
moveTower(n– 1,– 1,
temp,
– temp,from,
1, from,to, from);
temp,
}} moveTower(n – 1,
moveSingleDisk(from, to,
to);from);to);
}} moveSingleDisk(from, to);
}} n 3 from a–– 1,
moveTower(n
moveTower(n
to b
1, temp,
temp, to,
temp c
to, from);
from);
}}
}} n 2 from a to c temp b
n 1 from c to b temp a
A B C
int
int main()
main() {{
moveTower(3,
moveTower(3, 'a',
'a', 'b',
'b', 'c');
'c');
}} void
void moveTower(int n, char from,
moveTower(int n, char from, char
char to,
to, char
char temp)
temp) {{
if
if (n(n ==
== 1)
1) {{
void moveTower(int
voidmoveSingleDisk(from,
moveTower(int n,
n, char
char from,
to);
from, char
char to,
to, char
char temp)
temp) {{
ifmoveSingleDisk(from,
(n == 1) {{ to);
}} else
if {
(n == 1)
else moveSingleDisk(from,
{
moveTower(n – 1, from,
moveSingleDisk(from, to);
temp,
to);to);
moveTower(n –
}moveSingleDisk(from,
else { 1, from, temp, to);
}moveSingleDisk(from,
else { to);
to); temp, to);
moveTower(n
moveTower(n –
moveTower(n 1,– 1, from,
temp,
– temp, to,
1, from, from);
temp,
moveTower(n – 1,
moveSingleDisk(from, to,
to);from);to);
}} moveSingleDisk(from, to);
}} moveTower(n
moveTower(n –– 1, 1, temp,
temp, to,
to, from);
from);
}}
}} n 3 from a to b temp c
n 2 from a to b temp c
A B C
int
int main()
main() {{
moveTower(3,
moveTower(3, 'a',
'a', 'b',
'b', 'c');
'c');
}} void
void moveTower(int n, char from,
moveTower(int n, char from, char
char to,
to, char
char temp)
temp) {{
if
if (n
(n ==
== 1)
1) {{
moveSingleDisk(from,
moveSingleDisk(from, to); to);
}} else {
else {
moveTower(n
moveTower(n –– 1, 1, from,
from, temp,
temp, to);
to);
moveSingleDisk(from,
moveSingleDisk(from, to);to);
moveTower(n
moveTower(n –– 1, 1, temp,
temp, to,
to, from);
from);
}}
}}
n 3 from a to c temp b
A B C
int
int main()
main() {{
moveTower(3,
moveTower(3, 'a',
'a', 'b',
'b', 'c');
'c');
}} void
void moveTower(int n, char from,
moveTower(int n, char from, char
char to,
to, char
char temp)
temp) {{
if
if (n
(n ==
== 1)
1) {{
moveSingleDisk(from,
moveSingleDisk(from, to); to);
}} else {
else {
moveTower(n
moveTower(n –– 1, 1, from,
from, temp,
temp, to);
to);
moveSingleDisk(from,
moveSingleDisk(from, to);to);
moveTower(n
moveTower(n –– 1, 1, temp,
temp, to,
to, from);
from);
}}
}}
n 3 from a to c temp b
A B C
int
int main()
main() {{
moveTower(3,
moveTower(3, 'a',
'a', 'b',
'b', 'c');
'c');
}} void
void moveTower(int n, char from,
moveTower(int n, char from, char
char to,
to, char
char temp)
temp) {{
if
if (n
(n ==
== 1)
1) {{
moveSingleDisk(from,
moveSingleDisk(from, to); to);
}} else {
else {
moveTower(n
moveTower(n –– 1, 1, from,
from, temp,
temp, to);
to);
moveSingleDisk(from,
moveSingleDisk(from, to);to);
moveTower(n
moveTower(n –– 1, 1, temp,
temp, to,
to, from);
from);
}}
}}
n 3 from a to c temp b
A B C
int
int main()
main() {{
moveTower(3,
moveTower(3, 'a',
'a', 'b',
'b', 'c');
'c');
}} void
void moveTower(int n, char from,
moveTower(int n, char from, char
char to,
to, char
char temp)
temp) {{
if
if (n
(n ==
== 1)
1) {{
moveSingleDisk(from,
moveSingleDisk(from, to); to);
}} else {
else {
moveTower(n
moveTower(n –– 1, 1, from,
from, temp,
temp, to);
to);
moveSingleDisk(from,
moveSingleDisk(from, to);to);
moveTower(n
moveTower(n –– 1, 1, temp,
temp, to,
to, from);
from);
}}
}}
n 3 from a to c temp b
A B C
int
int main()
main() {{
moveTower(3,
moveTower(3, 'a',
'a', 'b',
'b', 'c');
'c');
}} void
void moveTower(int n, char from,
moveTower(int n, char from, char
char to,
to, char
char temp)
temp) {{
if
if (n(n ==
== 1)
1) {{
void moveTower(int
voidmoveSingleDisk(from,
moveTower(int n,
n, char
char from,
to);
from, char
char to,
to, char
char temp)
temp) {{
ifmoveSingleDisk(from,
(n == 1) {{ to);
}} else
if {
(n == 1)
else moveSingleDisk(from,
{
moveTower(n – 1, from,
moveSingleDisk(from, to);
temp,
to);to);
moveTower(n –
}moveSingleDisk(from,
else { 1, from, temp, to);
}moveSingleDisk(from,
else { to);
to); temp, to);
moveTower(n
moveTower(n –
moveTower(n 1,– 1, from,
temp,
– temp, to,
1, from, from);
temp,
moveTower(n – 1,
moveSingleDisk(from, to,
to);from);to);
}} moveSingleDisk(from, to);
}} moveTower(n
moveTower(n –– 1, 1, temp,
temp, to,
to, from);
from);
}}
}} n 3 from a to b temp c
n 2 from b to c temp a
A B C
int
int main()
main() {{
moveTower(3,
moveTower(3, 'a',
'a', 'b',
'b', 'c');
'c');
}} void
void moveTower(int n, char from,
moveTower(int n, char from, char
char to,
to, char
char temp)
temp) {{
if
if (n(n ==
== 1)
1) {{
void moveTower(int
voidmoveSingleDisk(from,
moveTower(int n,
n, char
char from,
to);
from, char
char to,
to, char
char temp)
temp) {{
ifmoveSingleDisk(from,
(n == 1) {{ to);
}} else
if {
(n == 1)
else moveSingleDisk(from,
{
moveTower(n – 1, from,
moveSingleDisk(from, to);
temp,
to);to);
moveTower(n –
}moveSingleDisk(from,
else { 1, from, temp, to);
}moveSingleDisk(from,
else { to);
to); temp, to);
moveTower(n
moveTower(n –
moveTower(n 1,– 1, from,
temp,
– temp, to,
1, from, from);
temp,
moveTower(n – 1,
moveSingleDisk(from, to,
to);from);to);
}} moveSingleDisk(from, to);
}} moveTower(n
moveTower(n –– 1, 1, temp,
temp, to,
to, from);
from);
}}
}} n 3 from a to b temp c
n 2 from b to c temp a
A B C
int
int main()
main() {{
moveTower(3,
moveTower(3, 'a',
'a', 'b',
'b', 'c');
'c');
}} void
void moveTower(int n, char from,
moveTower(int n, char from, char
char to,
to, char
char temp)
temp) {{
if
if (n(n ==
== 1)
1) {{
void moveTower(int
voidmoveSingleDisk(from,
moveTower(int n,
n, char
char from,
to);
from, char
char to,
to, char
char temp)
temp) {{
ifmoveSingleDisk(from,
(n == 1) {{ to);
}} else
if {
(n == 1)
else moveSingleDisk(from,
{
moveTower(n – 1, from,
moveSingleDisk(from, to);
temp,
to);to);
moveTower(n –
}moveSingleDisk(from,
else { 1, from, temp, to);
}moveSingleDisk(from,
else { to);
to); temp, to);
moveTower(n
moveTower(n –
moveTower(n 1,– 1, from,
temp,
– temp, to,
1, from, from);
temp,
moveTower(n – 1,
moveSingleDisk(from, to,
to);from);to);
}} moveSingleDisk(from, to);
}} moveTower(n
moveTower(n –– 1, 1, temp,
temp, to,
to, from);
from);
}}
}} n 3 from a to b temp c
n 2 from b to c temp a
A B C
int
int main()
main() {{
moveTower(3,
moveTower(3, 'a',
'a', 'b',
'b', 'c');
'c');
}} void
void moveTower(int n, char from,
moveTower(int n, char from, char
char to,
to, char
char temp)
temp) {{
if
if (n(n ==
== 1)
1) {{
void moveTower(int
voidmoveSingleDisk(from,
moveTower(int n,
n, char
char from,
to);
from, char
char to,
to, char
char temp)
temp) {{
ifmoveSingleDisk(from,
(n == 1) {{ to);
}} else
if {
(n == 1)
else moveSingleDisk(from,
{
moveTower(n – 1, from,
moveSingleDisk(from, to);
temp,
to);to);
moveTower(n –
}moveSingleDisk(from,
else { 1, from, temp, to);
}moveSingleDisk(from,
else { to);
to); temp, to);
moveTower(n
moveTower(n –
moveTower(n 1,– 1, from,
temp,
– temp, to,
1, from, from);
temp,
moveTower(n – 1,
moveSingleDisk(from, to,
to);from);to);
}} moveSingleDisk(from, to);
}} moveTower(n
moveTower(n –– 1, 1, temp,
temp, to,
to, from);
from);
}}
}} n 3 from a to b temp c
n 2 from b to c temp a
A B C
int
int main()
main() {{
moveTower(3,
moveTower(3, 'a',
'a', 'b',
'b', 'c');
'c');
}} void
void moveTower(int n, char from,
moveTower(int n, char from, char
char to,
to, char
char temp)
temp) {{
if
if (n(n ==
== 1)
1) {{
void moveTower(int
voidmoveSingleDisk(from,
moveTower(int n,
n, char
char from,
to);
from, char
char to,
to, char
char temp)
temp) {{
ifmoveSingleDisk(from,
(n == 1) {{ to);
}} else
if {
(n == 1)
else moveSingleDisk(from,
{
void
void moveTower(int
moveTower(int n,
n, char
char from,
to);
from, char
char to,
to, char
char temp)
temp) {{
moveTower(n – 1, from,
moveSingleDisk(from,
moveTower(n – { temp,
1, from, temp, to);
to); to);
if
if (n
{
(n ==
== 1)
}moveSingleDisk(from,
else 1) {
}moveSingleDisk(from,
else moveSingleDisk(from,
{ to);
to); temp,
moveTower(n – 1, from,
moveSingleDisk(from, to);
to);to);
moveTower(n
moveTower(n
moveTower(n –– 1,
1,– temp,
1,
temp, to,
from,
to, from);
temp,
from); to);
}moveSingleDisk(from,
else {
}moveSingleDisk(from,
else { to);
}} to); temp, to);
moveTower(n
moveTower(n
moveTower(n– 1,– 1,
temp,
– temp,from,
1, from,to, from);
temp,
}} moveTower(n – 1,
moveSingleDisk(from, to,
to);from);to);
}} moveSingleDisk(from, to);
}} n 3 from a–– 1,
moveTower(n
moveTower(n
to b
1, temp,
temp, to,
temp c
to, from);
from);
}}
}} n 2 from b to c temp a
n 1 from b to a temp c
A B C
int
int main()
main() {{
moveTower(3,
moveTower(3, 'a',
'a', 'b',
'b', 'c');
'c');
}} void
void moveTower(int n, char from,
moveTower(int n, char from, char
char to,
to, char
char temp)
temp) {{
if
if (n(n ==
== 1)
1) {{
void moveTower(int
voidmoveSingleDisk(from,
moveTower(int n,
n, char
char from,
to);
from, char
char to,
to, char
char temp)
temp) {{
ifmoveSingleDisk(from,
(n == 1) {{ to);
}} else
if {
(n == 1)
else moveSingleDisk(from,
{
void
void moveTower(int
moveTower(int n,
n, char
char from,
to);
from, char
char to,
to, char
char temp)
temp) {{
moveTower(n – 1, from,
moveSingleDisk(from,
moveTower(n – { temp,
1, from, temp, to);
to); to);
if
if (n
{
(n ==
== 1)
}moveSingleDisk(from,
else 1) {
}moveSingleDisk(from,
else moveSingleDisk(from,
{ to);
to); temp,
moveTower(n – 1, from,
moveSingleDisk(from, to);
to);to);
moveTower(n
moveTower(n
moveTower(n –– 1,
1,– temp,
1,
temp, to,
from,
to, from);
temp,
from); to);
}moveSingleDisk(from,
else {
}moveSingleDisk(from,
else { to);
}} to); temp, to);
moveTower(n
moveTower(n
moveTower(n– 1,– 1,
temp,
– temp,from,
1, from,to, from);
temp,
}} moveTower(n – 1,
moveSingleDisk(from, to,
to);from);to);
}} moveSingleDisk(from, to);
}} n 3 from a–– 1,
moveTower(n
moveTower(n
to b
1, temp,
temp, to,
temp c
to, from);
from);
}}
}} n 2 from b to c temp a
n 1 from b to a temp c
A B C
int
int main()
main() {{
moveTower(3,
moveTower(3, 'a',
'a', 'b',
'b', 'c');
'c');
}} void
void moveTower(int n, char from,
moveTower(int n, char from, char
char to,
to, char
char temp)
temp) {{
if
if (n(n ==
== 1)
1) {{
void moveTower(int
voidmoveSingleDisk(from,
moveTower(int n,
n, char
char from,
to);
from, char
char to,
to, char
char temp)
temp) {{
ifmoveSingleDisk(from,
(n == 1) {{ to);
}} else
if {
(n == 1)
else moveSingleDisk(from,
{
void
void moveTower(int
moveTower(int n,
n, char
char from,
to);
from, char
char to,
to, char
char temp)
temp) {{
moveTower(n – 1, from,
moveSingleDisk(from,
moveTower(n – { temp,
1, from, temp, to);
to); to);
if
if (n
{
(n ==
== 1)
}moveSingleDisk(from,
else 1) {
}moveSingleDisk(from,
else moveSingleDisk(from,
{ to);
to); temp,
moveTower(n – 1, from,
moveSingleDisk(from, to);
to);to);
moveTower(n
moveTower(n
moveTower(n –– 1,
1,– temp,
1,
temp, to,
from,
to, from);
temp,
from); to);
}moveSingleDisk(from,
else {
}moveSingleDisk(from,
else { to);
}} to); temp, to);
moveTower(n
moveTower(n
moveTower(n– 1,– 1,
temp,
– temp,from,
1, from,to, from);
temp,
}} moveTower(n – 1,
moveSingleDisk(from, to,
to);from);to);
}} moveSingleDisk(from, to);
}} n 3 from a–– 1,
moveTower(n
moveTower(n
to b
1, temp,
temp, to,
temp c
to, from);
from);
}}
}} n 2 from b to c temp a
n 1 from b to a temp c
A B C
int
int main()
main() {{
moveTower(3,
moveTower(3, 'a',
'a', 'b',
'b', 'c');
'c');
}} void
void moveTower(int n, char from,
moveTower(int n, char from, char
char to,
to, char
char temp)
temp) {{
if
if (n(n ==
== 1)
1) {{
void moveTower(int
voidmoveSingleDisk(from,
moveTower(int n,
n, char
char from,
to);
from, char
char to,
to, char
char temp)
temp) {{
ifmoveSingleDisk(from,
(n == 1) {{ to);
}} else
if {
(n == 1)
else moveSingleDisk(from,
{
void
void moveTower(int
moveTower(int n,
n, char
char from,
to);
from, char
char to,
to, char
char temp)
temp) {{
moveTower(n – 1, from,
moveSingleDisk(from,
moveTower(n – { temp,
1, from, temp, to);
to); to);
if
if (n
{
(n ==
== 1)
}moveSingleDisk(from,
else 1) {
}moveSingleDisk(from,
else moveSingleDisk(from,
{ to);
to); temp,
moveTower(n – 1, from,
moveSingleDisk(from, to);
to);to);
moveTower(n
moveTower(n
moveTower(n –– 1,
1,– temp,
1,
temp, to,
from,
to, from);
temp,
from); to);
}moveSingleDisk(from,
else {
}moveSingleDisk(from,
else { to);
}} to); temp, to);
moveTower(n
moveTower(n
moveTower(n– 1,– 1,
temp,
– temp,from,
1, from,to, from);
temp,
}} moveTower(n – 1,
moveSingleDisk(from, to,
to);from);to);
}} moveSingleDisk(from, to);
}} n 3 from a–– 1,
moveTower(n
moveTower(n
to b
1, temp,
temp, to,
temp c
to, from);
from);
}}
}} n 2 from b to c temp a
n 1 from b to a temp c
A B C
int
int main()
main() {{
moveTower(3,
moveTower(3, 'a',
'a', 'b',
'b', 'c');
'c');
}} void
void moveTower(int n, char from,
moveTower(int n, char from, char
char to,
to, char
char temp)
temp) {{
if
if (n(n ==
== 1)
1) {{
void moveTower(int
voidmoveSingleDisk(from,
moveTower(int n,
n, char
char from,
to);
from, char
char to,
to, char
char temp)
temp) {{
ifmoveSingleDisk(from,
(n == 1) {{ to);
}} else
if {
(n == 1)
else moveSingleDisk(from,
{
moveTower(n – 1, from,
moveSingleDisk(from, to);
temp,
to);to);
moveTower(n –
}moveSingleDisk(from,
else { 1, from, temp, to);
}moveSingleDisk(from,
else { to);
to); temp, to);
moveTower(n
moveTower(n –
moveTower(n 1,– 1, from,
temp,
– temp, to,
1, from, from);
temp,
moveTower(n – 1,
moveSingleDisk(from, to,
to);from);to);
}} moveSingleDisk(from, to);
}} moveTower(n
moveTower(n –– 1, 1, temp,
temp, to,
to, from);
from);
}}
}} n 3 from a to b temp c
n 2 from b to c temp a
A B C
int
int main()
main() {{
moveTower(3,
moveTower(3, 'a',
'a', 'b',
'b', 'c');
'c');
}} void
void moveTower(int n, char from,
moveTower(int n, char from, char
char to,
to, char
char temp)
temp) {{
if
if (n(n ==
== 1)
1) {{
void moveTower(int
voidmoveSingleDisk(from,
moveTower(int n,
n, char
char from,
to);
from, char
char to,
to, char
char temp)
temp) {{
ifmoveSingleDisk(from,
(n == 1) {{ to);
}} else
if {
(n == 1)
else moveSingleDisk(from,
{
moveTower(n – 1, from,
moveSingleDisk(from, to);
temp,
to);to);
moveTower(n –
}moveSingleDisk(from,
else { 1, from, temp, to);
}moveSingleDisk(from,
else { to);
to); temp, to);
moveTower(n
moveTower(n –
moveTower(n 1,– 1, from,
temp,
– temp, to,
1, from, from);
temp,
moveTower(n – 1,
moveSingleDisk(from, to,
to);from);to);
}} moveSingleDisk(from, to);
}} moveTower(n
moveTower(n –– 1, 1, temp,
temp, to,
to, from);
from);
}}
}} n 3 from a to b temp c
n 2 from b to c temp a
A B C
int
int main()
main() {{
moveTower(3,
moveTower(3, 'a',
'a', 'b',
'b', 'c');
'c');
}} void
void moveTower(int n, char from,
moveTower(int n, char from, char
char to,
to, char
char temp)
temp) {{
if
if (n(n ==
== 1)
1) {{
void moveTower(int
voidmoveSingleDisk(from,
moveTower(int n,
n, char
char from,
to);
from, char
char to,
to, char
char temp)
temp) {{
ifmoveSingleDisk(from,
(n == 1) {{ to);
}} else
if {
(n == 1)
else moveSingleDisk(from,
{
moveTower(n – 1, from,
moveSingleDisk(from, to);
temp,
to);to);
moveTower(n –
}moveSingleDisk(from,
else { 1, from, temp, to);
}moveSingleDisk(from,
else { to);
to); temp, to);
moveTower(n
moveTower(n –
moveTower(n 1,– 1, from,
temp,
– temp, to,
1, from, from);
temp,
moveTower(n – 1,
moveSingleDisk(from, to,
to);from);to);
}} moveSingleDisk(from, to);
}} moveTower(n
moveTower(n –– 1, 1, temp,
temp, to,
to, from);
from);
}}
}} n 3 from a to b temp c
n 2 from b to c temp a
A B C
int
int main()
main() {{
moveTower(3,
moveTower(3, 'a',
'a', 'b',
'b', 'c');
'c');
}} void
void moveTower(int n, char from,
moveTower(int n, char from, char
char to,
to, char
char temp)
temp) {{
if
if (n(n ==
== 1)
1) {{
void moveTower(int
voidmoveSingleDisk(from,
moveTower(int n,
n, char
char from,
to);
from, char
char to,
to, char
char temp)
temp) {{
ifmoveSingleDisk(from,
(n == 1) {{ to);
}} else
if {
(n == 1)
else moveSingleDisk(from,
{
moveTower(n – 1, from,
moveSingleDisk(from, to);
temp,
to);to);
moveTower(n –
}moveSingleDisk(from,
else { 1, from, temp, to);
}moveSingleDisk(from,
else { to);
to); temp, to);
moveTower(n
moveTower(n –
moveTower(n 1,– 1, from,
temp,
– temp, to,
1, from, from);
temp,
moveTower(n – 1,
moveSingleDisk(from, to,
to);from);to);
}} moveSingleDisk(from, to);
}} moveTower(n
moveTower(n –– 1, 1, temp,
temp, to,
to, from);
from);
}}
}} n 3 from a to b temp c
n 2 from b to c temp a
A B C
int
int main()
main() {{
moveTower(3,
moveTower(3, 'a',
'a', 'b',
'b', 'c');
'c');
}} void
void moveTower(int n, char from,
moveTower(int n, char from, char
char to,
to, char
char temp)
temp) {{
if
if (n(n ==
== 1)
1) {{
void moveTower(int
voidmoveSingleDisk(from,
moveTower(int n,
n, char
char from,
to);
from, char
char to,
to, char
char temp)
temp) {{
ifmoveSingleDisk(from,
(n == 1) {{ to);
}} else
if {
(n == 1)
else moveSingleDisk(from,
{
void
void moveTower(int
moveTower(int n,
n, char
char from,
to);
from, char
char to,
to, char
char temp)
temp) {{
moveTower(n – 1, from,
moveSingleDisk(from,
moveTower(n – { temp,
1, from, temp, to);
to); to);
if
if (n
{
(n ==
== 1)
}moveSingleDisk(from,
else 1) {
}moveSingleDisk(from,
else moveSingleDisk(from,
{ to);
to); temp,
moveTower(n – 1, from,
moveSingleDisk(from, to);
to);to);
moveTower(n
moveTower(n
moveTower(n –– 1,
1,– temp,
1,
temp, to,
from,
to, from);
temp,
from); to);
}moveSingleDisk(from,
else {
}moveSingleDisk(from,
else { to);
}} to); temp, to);
moveTower(n
moveTower(n
moveTower(n– 1,– 1,
temp,
– temp,from,
1, from,to, from);
temp,
}} moveTower(n – 1,
moveSingleDisk(from, to,
to);from);to);
}} moveSingleDisk(from, to);
}} n 3 from a–– 1,
moveTower(n
moveTower(n
to b
1, temp,
temp, to,
temp c
to, from);
from);
}}
}} n 2 from b to c temp a
n 1 from a to c temp b
A B C
int
int main()
main() {{
moveTower(3,
moveTower(3, 'a',
'a', 'b',
'b', 'c');
'c');
}} void
void moveTower(int n, char from,
moveTower(int n, char from, char
char to,
to, char
char temp)
temp) {{
if
if (n(n ==
== 1)
1) {{
void moveTower(int
voidmoveSingleDisk(from,
moveTower(int n,
n, char
char from,
to);
from, char
char to,
to, char
char temp)
temp) {{
ifmoveSingleDisk(from,
(n == 1) {{ to);
}} else
if {
(n == 1)
else moveSingleDisk(from,
{
void
void moveTower(int
moveTower(int n,
n, char
char from,
to);
from, char
char to,
to, char
char temp)
temp) {{
moveTower(n – 1, from,
moveSingleDisk(from,
moveTower(n – { temp,
1, from, temp, to);
to); to);
if
if (n
{
(n ==
== 1)
}moveSingleDisk(from,
else 1) {
}moveSingleDisk(from,
else moveSingleDisk(from,
{ to);
to); temp,
moveTower(n – 1, from,
moveSingleDisk(from, to);
to);to);
moveTower(n
moveTower(n
moveTower(n –– 1,
1,– temp,
1,
temp, to,
from,
to, from);
temp,
from); to);
}moveSingleDisk(from,
else {
}moveSingleDisk(from,
else { to);
}} to); temp, to);
moveTower(n
moveTower(n
moveTower(n– 1,– 1,
temp,
– temp,from,
1, from,to, from);
temp,
}} moveTower(n – 1,
moveSingleDisk(from, to,
to);from);to);
}} moveSingleDisk(from, to);
}} n 3 from a–– 1,
moveTower(n
moveTower(n
to b
1, temp,
temp, to,
temp c
to, from);
from);
}}
}} n 2 from b to c temp a
n 1 from a to c temp b
A B C
int
int main()
main() {{
moveTower(3,
moveTower(3, 'a',
'a', 'b',
'b', 'c');
'c');
}} void
void moveTower(int n, char from,
moveTower(int n, char from, char
char to,
to, char
char temp)
temp) {{
if
if (n(n ==
== 1)
1) {{
void moveTower(int
voidmoveSingleDisk(from,
moveTower(int n,
n, char
char from,
to);
from, char
char to,
to, char
char temp)
temp) {{
ifmoveSingleDisk(from,
(n == 1) {{ to);
}} else
if {
(n == 1)
else moveSingleDisk(from,
{
void
void moveTower(int
moveTower(int n,
n, char
char from,
to);
from, char
char to,
to, char
char temp)
temp) {{
moveTower(n – 1, from,
moveSingleDisk(from,
moveTower(n – { temp,
1, from, temp, to);
to); to);
if
if (n
{
(n ==
== 1)
}moveSingleDisk(from,
else 1) {
}moveSingleDisk(from,
else moveSingleDisk(from,
{ to);
to); temp,
moveTower(n – 1, from,
moveSingleDisk(from, to);
to);to);
moveTower(n
moveTower(n
moveTower(n –– 1,
1,– temp,
1,
temp, to,
from,
to, from);
temp,
from); to);
}moveSingleDisk(from,
else {
}moveSingleDisk(from,
else { to);
}} to); temp, to);
moveTower(n
moveTower(n
moveTower(n– 1,– 1,
temp,
– temp,from,
1, from,to, from);
temp,
}} moveTower(n – 1,
moveSingleDisk(from, to,
to);from);to);
}} moveSingleDisk(from, to);
}} n 3 from a–– 1,
moveTower(n
moveTower(n
to b
1, temp,
temp, to,
temp c
to, from);
from);
}}
}} n 2 from b to c temp a
n 1 from a to c temp b
A B C
int
int main()
main() {{
moveTower(3,
moveTower(3, 'a',
'a', 'b',
'b', 'c');
'c');
}} void
void moveTower(int n, char from,
moveTower(int n, char from, char
char to,
to, char
char temp)
temp) {{
if
if (n(n ==
== 1)
1) {{
void moveTower(int
voidmoveSingleDisk(from,
moveTower(int n,
n, char
char from,
to);
from, char
char to,
to, char
char temp)
temp) {{
ifmoveSingleDisk(from,
(n == 1) {{ to);
}} else
if {
(n == 1)
else moveSingleDisk(from,
{
void
void moveTower(int
moveTower(int n,
n, char
char from,
to);
from, char
char to,
to, char
char temp)
temp) {{
moveTower(n – 1, from,
moveSingleDisk(from,
moveTower(n – { temp,
1, from, temp, to);
to); to);
if
if (n
{
(n ==
== 1)
}moveSingleDisk(from,
else 1) {
}moveSingleDisk(from,
else moveSingleDisk(from,
{ to);
to); temp,
moveTower(n – 1, from,
moveSingleDisk(from, to);
to);to);
moveTower(n
moveTower(n
moveTower(n –– 1,
1,– temp,
1,
temp, to,
from,
to, from);
temp,
from); to);
}moveSingleDisk(from,
else {
}moveSingleDisk(from,
else { to);
}} to); temp, to);
moveTower(n
moveTower(n
moveTower(n– 1,– 1,
temp,
– temp,from,
1, from,to, from);
temp,
}} moveTower(n – 1,
moveSingleDisk(from, to,
to);from);to);
}} moveSingleDisk(from, to);
}} n 3 from a–– 1,
moveTower(n
moveTower(n
to b
1, temp,
temp, to,
temp c
to, from);
from);
}}
}} n 2 from b to c temp a
n 1 from a to c temp b
A B C
int
int main()
main() {{
moveTower(3,
moveTower(3, 'a',
'a', 'b',
'b', 'c');
'c');
}} void
void moveTower(int n, char from,
moveTower(int n, char from, char
char to,
to, char
char temp)
temp) {{
if
if (n(n ==
== 1)
1) {{
void moveTower(int
voidmoveSingleDisk(from,
moveTower(int n,
n, char
char from,
to);
from, char
char to,
to, char
char temp)
temp) {{
ifmoveSingleDisk(from,
(n == 1) {{ to);
}} else
if {
(n == 1)
else moveSingleDisk(from,
{
moveTower(n – 1, from,
moveSingleDisk(from, to);
temp,
to);to);
moveTower(n –
}moveSingleDisk(from,
else { 1, from, temp, to);
}moveSingleDisk(from,
else { to);
to); temp, to);
moveTower(n
moveTower(n –
moveTower(n 1,– 1, from,
temp,
– temp, to,
1, from, from);
temp,
moveTower(n – 1,
moveSingleDisk(from, to,
to);from);to);
}} moveSingleDisk(from, to);
}} moveTower(n
moveTower(n –– 1, 1, temp,
temp, to,
to, from);
from);
}}
}} n 3 from a to b temp c
n 2 from b to c temp a
A B C
int
int main()
main() {{
moveTower(3,
moveTower(3, 'a',
'a', 'b',
'b', 'c');
'c');
}} void
void moveTower(int n, char from,
moveTower(int n, char from, char
char to,
to, char
char temp)
temp) {{
if
if (n
(n ==
== 1)
1) {{
moveSingleDisk(from,
moveSingleDisk(from, to); to);
}} else {
else {
moveTower(n
moveTower(n –– 1, 1, from,
from, temp,
temp, to);
to);
moveSingleDisk(from,
moveSingleDisk(from, to);to);
moveTower(n
moveTower(n –– 1, 1, temp,
temp, to,
to, from);
from);
}}
}}
n 3 from a to b temp c
A B C
int
int main()
main() {{
moveTower(3,
moveTower(3, 'a',
'a', 'b',
'b', 'c');
'c');
}}
A B C
Emergent Behavior
● Even though each function call does very
little work, the overall behavior of the
function is to solve the Towers of Hanoi.
● It's often tricky to think recursively
because of this emergent behavior:
● No one function call solves the entire
problem.
● Each function does only a small amount of
work on its own and delegates the rest.
Writing Recursive Functions
● Although it is good to be able to trace through a
set of recursive calls to understand how they work,
you will need to build up an intuition for recursion
to use it effectively.
● You will need to learn to trust that your recursive
calls – which are to the function that you are
currently writing! - will indeed work correctly.
● Eric Roberts calls this the “Recursive Leap of Faith.”
● Everyone can learn to think recursively. If this
seems confusing now, don't panic. You'll start
picking this up as we continue forward.
void moveTower(int n, char from, char to, char temp) {
if (n == 1) {
moveSingleDisk(from, to);
} else {
moveTower(n – 1, from, temp, to);
moveSingleDisk(from, to);
moveTower(n – 1, temp, to, from);
}
}
void moveTower(int n, char from, char to, char temp) {
if (n == 1) {
moveSingleDisk(from, to);
} else {
moveTower(n – 1, from, temp, to);
moveSingleDisk(from, to);
moveTower(n – 1, temp, to, from);
}
}
void moveTower(int n, char from, char to, char temp) {
if (n == 0) {
} else {
moveTower(n – 1, from, temp, to);
moveSingleDisk(from, to);
moveTower(n – 1, temp, to, from);
}
}
void moveTower(int n, char from, char to, char temp) {
if (n != 0) {
moveTower(n – 1, from, temp, to);
moveSingleDisk(from, to);
moveTower(n – 1, temp, to, from);
}
}
Parking Randomly
0 Car has
length one 5
Parking Randomly
0 5
Parking Randomly
● Given a curb of length five, how many
cars, on average, can park on the curb?
● We can get an approximate value
through random simulation:
● Simulate random parking a large number of
times.
● Output the average number of cars that
could park.
● Question: How do we simulate parking
cars on the curb?
Parking Randomly
0 5
Parking Randomly
0 5
Parking Randomly
0 x x+1 5
Parking Randomly
0 x x+1 5
Parking Randomly
0 x x+1 5
Place cars randomly in these ranges!
Parking Randomly