[PDF]

!"#$
&''
(
)
+
{
if (n <= 1) return 1;
*
void f()
{
f(); // calls f(), calls f(), calls f(),...
return n * fac(n-1); // n > 1
}
)
*
// POST: return value is n!
unsigned int fac (unsigned int n)
%
}
,
0 *
"
)4 fac(3)$
-
+
// POST: return value is n!
*
unsigned int fac (unsigned int n)
,
{ // n = 3
fac(n) 2
if (n <= 1) return 1;
*
.*
/
return n * fac(n-1); // n > 1
3
0
0
}
1
0 *
5
0
0
-
0 *
"
)4 fac(3)$
"
)4 fac(3)$
// POST: return value is n!
// POST: return value is n!
unsigned int fac (unsigned int n)
unsigned int fac (unsigned int n)
{ // n = 3
{ // n = 3
if (n <= 1) return 1;
if (n <= 1) return 1;
return n * fac(n-1); // n > 1
return n * fac(n-1); // n > 1
}
0
}
620 *
0
0
62
n-1 == 2
0
0
*
0
*
") 4 fac(3)$
") 4 fac(3)$
// POST: return value is n!
// POST: return value is n!
unsigned int fac (unsigned int n)
unsigned int fac (unsigned int n)
{ // n = 2
{ // n = 2
if (n <= 1) return 1;
if (n <= 1) return 1;
return n * fac(n-1); // n > 1
}
5
0
0
return n * fac(n-1); // n > 1
}
0
-
7
fac (3),
/ ) )*
5
0
fac (2)
0
-
*
0
") 4 fac(3)$
// POST: return value is n!
4
unsigned int fac (unsigned int n)
0
-
{ // n = 2
if (n <= 1) return 1;
6
*
/
2
0
+ 6 "
8
9 $
*
-
return n * fac(n-1); // n > 1
}
5
0
-
0
fac (2)
0
0
7
-
4
*
0
/*
+ 6
"
/
0
*
:
+ 6
$
;:
,
7
;:
0
:
"
,
$)
*
<
=
"
4*
$
%>
+ 6$
2
"
$
// POST: return value is the greatest common
//
divisor of a and b
unsigned int gcd (unsigned int a, unsigned int b)
{
if (b == 0) return a;
return gcd(b, a % b); // b != 0
}
?
"
,
" >$
" $
2
"
$
%>
=
;:
,
// POST: return value is the greatest common
//
divisor of a and b
unsigned int gcd (unsigned int a, unsigned int b)
{
if (b == 0) return a;
return gcd(b, a % b); // b != 0
}
,
2
3
0
*
/
;:
,
// POST: return value is the greatest common
//
divisor of a and b
unsigned int gcd (unsigned int a, unsigned int b)
{
if (b == 0) return a;
return gcd(b, a % b); // b != 0
}
?
,
6
*
*
#<
>
2>
2
2
>
#
'
#<
#9
%
98BC 89
=
@
A
"
66
$
#
"9>9$
// POST: return value is the n-th
//
Fibonacci number F_n
unsigned int fib (unsigned int n)
{
if (n == 0) return 0;
if (n == 1) return 1;
return fib(n-1) + fib(n-2); // n > 1
}
?
,
#<
5
// POST: return value is the n-th
//
Fibonacci number F_n
unsigned int fib (unsigned int n)
{
if (n == 0) return 0;
if (n == 1) return 1;
return fib(n-1) + fib(n-2); // n > 1
}
fib (50)
= ) 2
.* 1
DC
9#
DE
DB
C#
DD
8#
8#
DF
B#
@ )6
5
G
6)
"
+
0
)*
$
6
H
#
*
)
7
7
7
*
0
7
)
)
I
// POST: return value is the greatest common
//
divisor of a and b
unsigned int gcd (unsigned int a, unsigned int b)
{
if (b == 0) return a;
return gcd(b, a % b); // b != 0
}
// POST: return value is the greatest common divisor of a and b
unsigned int gcd2 (unsigned int a, unsigned int b)
{
while (b != 0) {
unsigned int a_prev = a;
a = b;
b = a_prev % b;
}
return a;
}
.
"
7
$→ "
$
1
#
<
)
5 2
/
// POST: return value is the greatest common divisor of a and b
unsigned int gcd2 (unsigned int a, unsigned int b)
{
while (b != 0) {
unsigned int a_prev = a;
a = b;
b = a_prev % b;
}
return a;
}
.
"
$→ "
"
$
>
6
$
1
)
<
0
9
/*
)
<
"
I
<
*
8
a, b$
#<
#<
// POST: return value is the n-th Fibonacci number F_n
unsigned int fib2 (unsigned int n)
{
if (n == 0) return 0;
if (n <= 2) return 1;
unsigned int a = 1; // F_1
unsigned int b = 1; // F_2
for (unsigned int i = 3; i <= n; ++i) {
unsigned int a_prev = a; // F_{i-2}
a = b;
// F_{i-1}
b += a_prev;
// F_{i-1} += F_{i-2} -> F_i
}
return b;
}
.
"
$→ "
$
1
#9
#
#
a
0
0"
0" #
'
0" #
$
0" # $
$
?
*I
9> J
$
G
#
#
a
0
6
0
#9
b
#
$
// POST: return value is the n-th Fibonacci number F_n
unsigned int fib2 (unsigned int n)
{
fib2(50)
if (n == 0) return 0;
if (n <= 2) return 1;
unsigned int a = 1; // F_1
unsigned int b = 1; // F_2
for (unsigned int i = 3; i <= n; ++i) {
unsigned int a_prev = a; // F_{i-2}
a = b;
// F_{i-1}
b += a_prev;
// F_{i-1} += F_{i-2} -> F_i
}
return b;
}
.
"
$→ "
$
1
>
%>
>
%> %>
"
b
#
// POST: return value is the Ackermann function
//
value A(m,n)
unsigned int A (unsigned int m, unsigned int n) {
if (m == 0) return n+1;
if (n == 0) return A(m-1,1);
return A(m-1, A(m, n-1));
}
0
#
>
0
9
8
9
8
D
'
9
8
D
B
'9
9
8
B
E
K
9 '8
8
B
8
9K
F
'8#8
>
D
8
FBB88 9FBB8F#8 9
0
>
9
#8
99
'8 <*
#
9
8
9
8
D
'
9
8
D
B
'9
9
8
B
E
K
9 '8
8
B
8
9K
F
>
9
9FBB8F
,
#
6
#8
D
8
FBB88 9FBB8F#8 9
9
#8
)
99
6
#
+
I
I
2
<
$
"
L
M
;
7
)
6
/
-:
-
4
6
7 ) )
* /)
5
'8#8
9
9FBB8F
+
H6
#8
#
#
+
+
*
6
M
C
F
9
B
*
6
M
D
E
8
C
→
<
F
9
B
D
F
9
B
D
C
E
8
E
8
<
#
#
+
+
*
6
M
F
9
B
<
*
6
M
D
C
E
8
→
F
9
B
D
C
E
8
9
F
B
D
C
E
8
<
#
#
// PRE: [first, last) is a valid range
// POST: the elements *p, p in [first, last) are in
//
ascending order
void minimum_sort (int* first, int* last)
{
for (int* p = first; p != last; ++p) {
// find minimum in nonempty range described by [p, last)
int* p_min = p; // pointer to current minimum
int* q = p;
// pointer to current element
while (++q != last)
if (*q < *p_min) p_min = q;
// interchange *p with *p_min
p
last
std::iter_swap (p, p_min);
}
}
+
*
6
M
9
F
B
D
C
E
8
<
9
F
B
D
C
E
8
*
<
#
#
// PRE: [first, last) is a valid range
// POST: the elements *p, p in [first, last) are in
//
ascending order
void minimum_sort (int* first, int* last)
{
for (int* p = first; p != last; ++p) {
// find minimum in nonempty range described by [p, last)
int* p_min = p; // pointer to current minimum
int* q = p;
// pointer to current element
while (++q != last)
if (*q < *p_min) p_min = q;
// interchange *p with *p_min
p
p_min
std::iter_swap (p, p_min);
}
}
9
F
B
D
C
E
// PRE: [first, last) is a valid range
// POST: the elements *p, p in [first, last) are in
//
ascending order
void minimum_sort (int* first, int* last)
{
for (int* p = first; p != last; ++p) {
// find minimum in nonempty range described by [p, last)
int* p_min = p; // pointer to current minimum
int* q = p;
// pointer to current element
while (++q != last)
if (*q < *p_min) p_min = q;
// interchange *p with *p_min
p
p_min
std::iter_swap (p, p_min);
}
}
8
9
8
B
D
C
E
#include<algorithm%
<
<
F
#
I
, )
I
2=
)
#
@
=
6
2
)
#
*q < *p_min
0)
0)
*
)
H6
6 6
2=
)
/*
H6
"*
'
# 9'
'
#
// PRE: [first, last) is a valid range
// POST: the elements *p, p in [first, last) are in
//
ascending order
void minimum_sort (int* first, int* last)
7
{
for (int* p = first; p != last; ++p) {
// find minimum in nonempty range described by [p, last)
int* p_min = p; // pointer to current minimum
int* q = p;
// pointer to current element
while (++q != last)
if (*q < *p_min) p_min = q;
// interchange *p with *p_min
std::iter_swap (p, p_min);
}
}
$
)
// PRE: [first, last) is a valid range
// POST: the elements *p, p in [first, last) are in
//
ascending order
void minimum_sort (int* first, int* last)
7
{
for (int* p = first; p != last; ++p) {
// find minimum in nonempty range described by [p, last)
int* p_min = p; // pointer to current minimum
int* q = p;
// pointer to current element
while (++q != last)
if (*q < *p_min) p_min = q;
// interchange *p with *p_min
std::iter_swap (p, p_min);
}
}
#
#
2=
" # $N9
2=
)
// PRE: [first, last) is a valid range
// POST: the elements *p, p in [first, last) are in
//
ascending order
void minimum_sort (int* first, int* last)
7
{
for (int* p = first; p != last; ++p) {
// find minimum in nonempty range described by [p, last)
int* p_min = p; // pointer to current minimum
int* q = p;
// pointer to current element
while (++q != last)
if (*q < *p_min) p_min = q;
// interchange *p with *p_min
std::iter_swap (p, p_min);
}
}
:
" # $N9H6
"6 6
$
#
2=
)
#
// PRE: [first, last) is a valid range
// POST: the elements *p, p in [first, last) are in
//
ascending order
void minimum_sort (int* first, int* last)
7
{
for (int* p = first; p != last; ++p) {
// find minimum in nonempty range described by [p, last)
int* p_min = p; // pointer to current minimum
int* q = p;
// pointer to current element
while (++q != last)
if (*q < *p_min) p_min = q;
// interchange *p with *p_min
std::iter_swap (p, p_min);
}
}
" # $N9'
H6
"6 6
#
6
B
9>
C>
*
*
0)
0)
"@&$
#9
)
2
6 6
" O $N9
#
7
F>> >>>
)
89>
)
2= )
> #
"@&$
#9
>> >>> 9>> >>> D>> >>> C>> >>
>
9C>
;
"
6
E8289
=
8DB
= ) N 8D
;& 6" $
$
=
)
;
>> >>> 9>> >>> D>> >>> C>> >>
>
;
"
)
1@
2;
) <
*q < *p_min
$
2= )
> #
7
0 .
/
6 6
2=
B
9>
C>
89>
F>> >>>
9C>
$
>2 E
= ) N 8D
;& 6" $
(
I
2>E
88B
0)
D29D
88
C2>F
8D
=
)
)
2
>2 E
2
2>E
88B
> >>> >>> <
D29D
88
I
C2>F
8D
E8289
8DB
#
9,
#
#
"
$
0
?
+
@
1"
A
,
;
@
,R
6
:
+
)
*
6
1
4
?
6
1
4
3
2
5
, 6
=
:
, 6
2,
2+
#
?
6
0
?
<
2,
+ 6
+ 6
3
2
5
6
<
.
,
P& Q $
:
#
0
?
2+
6
1
4
3
2
5
2,
2+
?
6
<
+
92+
+ 6
6
1
4
3
2
5
1
4
6
2
3
5
#
2A
0
?
+
#
2+
?
+ 6 )
+ 62
) /*
+ 6
?
2
3
5
2
3
5
4
6
1
4
6
4
3
2
1
3
2
1
2
1
1
// PRE: [first, last) is a valid range
// POST: the elements *p, p in [first, last) are in
//
ascending order
void merge_sort (int* first, int* last)
{
int n = last - first;
if (n <= 1) return;
// nothing to do
int* middle = first + n/2;
merge_sort (first, middle); // sort first half
merge_sort (middle, last);
// sort second half
merge (first, middle, last); // merge both halfs
}
6
<
82
#
4
6
3
5
4
6
5
&''2 ,
#
// PRE: [first, last) is a valid range
// POST: the elements *p, p in [first, last) are in
//
ascending order
void merge_sort (int* first, int* last)
{
int n = last - first;
if (n <= 1) return;
// nothing to do
int* middle = first + n/2;
merge_sort (first, middle); // sort first half
merge_sort (middle, last);
// sort second half
merge (first, middle, last); // merge both halfs
}
N9 7
" N9
N9 7
&''
$
" N9
&''2 A
// PRE: [first, last) is a valid range
// POST: the elements *p, p in [first, last) are in
//
ascending order
void merge_sort (int* first, int* last)
{
int n = last - first;
if (n <= 1) return;
// nothing to do
int* middle = first + n/2;
merge_sort (first, middle); // sort first half
merge_sort (middle, last);
// sort second half
merge (first, middle, last); // merge both halfs
}
)
$
+ 6
#
#
// PRE: [first, middle), [middle, last) are valid ranges; in
//
both of them, the elements are in ascending order
void merge (int* first, int* middle, int* last)
{
int n = last - first;
// total number of cards
int* deck = new int[n]; // new deck to be built
int* left = first;
// top card of left deck
int* right = middle; // top card of right deck
for (int* d = deck; d != deck + n; ++d)
// put next card onto new deck
if
(left == middle) *d = *right++; // left deck is empty
else if (right == last) *d = *left++; // right deck is empty
else if (*left < *right) *d = *left++; // smaller top card left
else
*d = *right++; // smaller top card right
2= )
*
6 6
) 0)
*left < *right "
$
0
// copy new deck back into [first, last)
int *d = deck;
while (first != middle) *first++ = *d++;
while (middle != last) *middle++ = *d++;
*
merge
4
)
*
;:
"
+ 6
delete[] deck;
}
#
2= )
+ )
2
2= )
4* 2
merge_sort
S <
:
" O $
#
G
+ 6 )
+ 6
merge :
#
/ ?
) $
," $
G
+
)
*
<
:
9
)
*
)
* <
, ">$ , " $ >
, "9$
, "8$ 9
:
0)
<
merge_sort
#
2=
)
#
4* 2
," $
G
+
)*
<
:
0)
<
merge_sort
:
0)
+ 6
G
#
+
-
I
"
*
)
5
S $
*
0
," $ " O$
9
2 , " $ > " # >$
," $ ,"
G
2=
N
9 $' , "
0)
+ 6
2=
S9
T
"5
< )
"5
G
9
N
9 $' #
S9
0)
)
#
0
7
," $ ,"
# U
$
0
2=
N
9 $' , "
S
$
)
3
N
9 $' #
#
2=
)
7
," $ ," N
9$' , " N
9$' #
9# $ 9 N
9 '
" N
9# $ 9 N
9 ' #
" N
5
#
2=
7
," $ ," N
9$' , " N
9$' #
9# $ 9 N
9 '
" N
9# $ 9 N
9 ' #
" N
9 # $"
# $'
" N
9
9 # $"
#
$
' #
" N
9
0
#
7
," $ ,
"
"
"
"
"
2=
"
)
N
9$' , " N
9$' #
N
9# $ 9 N
9 '
N
9# $ 9 N
9 ' #
N
9 # $"
# $'
9
N
9 # $"
# $
' #
9
O9$"
#
$
'
#
9
)
CK
#
7
," $ ,
"
"
"
"
"
2=
"
)
N
9$' , " N
9$' #
N
9# $ 9 N
9 '
N
9# $ 9 N
9 ' #
N
9 # $"
# $'
9
N
9 # $"
# $
' #
9
O $"
#
$
'
#
9
#
#
7
," $
2=
,"
"
"
"
"
"
"
#
7
7
)
N
9$ ' , " N
9$ ' #
N
9# $
N
9 '
9
N
9# $
N
9 ' #
9
N
9# $ "
# $'
9
N
9# $"
#
$' #
9
O $"
# $' #
9
O $"
$
9
2=
>
)
#
E
8F
EF
F
6
E
8F
EF
9K
KF
F>> >>>
F
88F
$
=
)
> EB
= ) N
;& 6" $
0
J
DD
8BC
:
9BE
*
#
2=
>
7
89
B8F
9>>
F>
H6
)
#
;*
"@&$
#9
>> >>> 9>> >>> D>> >>> C>> >>
>
88F
6
E
8F
EF
9K
KF
F>> >>>
F
88F
"
$
=
"@&$
#9
"
F>> >>>
"
)
#
>> >>> 9>> >>> D>> >>> C>> >>
>
"@&$
#9
>> >>> 9>> >>> D>> >>> C>> >>
>
6
2=
>
)
$
> EB
9K
KF
89
B8F
9>>
F>
=
)
> EB
89
%9
= ) N
;& 6" $
merge_sort
DD
8BC
SB>#
9BE
< 6 ;
6* minimum_sort...
= ) N
;& 6" $
DD
8BC
*
9BE
V
9>>
)
B8F
F>