[PDF]

{|
~ z
{| y}
{|
x€
G=
2
28 H
2> 51
97
67
8
>
G q 91
::7
9 68 B @
6 5
> 8 67
5
61
61
5[
M21 :7
7
? 67
5
5
H ^oS
H ]
8
2 :8
G7 B
58
6
5
67
2C7
?7
1
:
F>9=
?7 B
<
:7
?>
=;
4\
79
2= 5 8
=
2>
5
5
5
7
; 19
68 6
2> 8 2< ;
9
2> 51 2= 5 8
97 9
1
> 8 ::
5 61
? 67 > 8
7F > 5
> G h=
79 2
M7 5 8 i
?
<2 ; 7 ;
9 2> 6
2= 5 8 8
>
91 2 51
9
:: 7
2P =;
5
M71 67
?
=
<1 : ;
2 5 8 41
:
C ?1
C<
247
G B 5
7 21
@
? 5 67 5
7 67
?= ; :8
7 7;
5
C7 47 8
5
=
f(n-1)
37
5
? 57
24 8 41
:
5G 8 1 57 ?1
C
<
::8 H @ _ 2
47
E7 < k
5 G5 B 5
2 67
2=
G 7 9 68
2 6 F 5= H
2= 8
7 2> 51 =
;
5 97 5 67
67 = F
2= ; ?
7
M7
5 G @= <= 8
61
5 7 2> 8
h < > B
E7 >7 2 51
2 := 2 8 9
7
C> 5 ?
i 67 = ;
5= M7
1 4
5 <: 5
67 1 67
91 2= 5 8 91
::
::
<n
8
2 57
1
<? 5
1
:
3:
l
G7
28
2> 51
97
=
;
5
67
?= ;
21
F4 8
7 :8
>
5
61
5
< k 41
G 5 ?1 :
1 <C
8
G 5S 247
61 5
5 8
>8 >
5
5 h ? 67
67 7
i ?=
?= ; 7 ;
2
41 88
:?1 1 5 8
:
C< j7 8
247 G @
5 ml 5 8
6
< H
5=
41
9 58
?> 5=
1
C7
?< @
1
2= 5 8
?= ;
21
57
> 51
247
5
8
J>7
C8 7
6 9
F= 5 <
?7 57
21 2 @ B
J7
@
H 5
T
68
?> A
H \ >
2 8 75
97 M1
<1 :
57
61 > 5
M>1 67
J7
<7 : F?
B 7 B
>
5 2=> 8
67
5
<9 8
? :1
5
? 67
?1
F
2 @8
n-1
~
58
6
8
>5
G>
g
91
G ::
?=
MC1
<7 : H
F> 8
<
2= 5
:7
2> 8
<
?> 68
T
;
fac(n-1)
‰„ z x
8
5 C6
67 5
> 51 F?=
9 g 271
Fh
< =@
> ;
67
> i 5 67
5
5
5
<2 ;
9
2= 5 8
2 5 :8
<>
@
H
=
67
2 61
B
fac(3)
1
5 1>
67 H 3
5
f7
;
5V
?= ; ?> 5
41 3 5=
?1 : <2
C< ? @7
247 >
2 51
5
G@
8
2> 8 61
8 J7 5
1 58 1
:j 8 9
7 5:
G@ 3
F 61
58 F
6 27
21 >
<? @
@ 2
2> 8 8
97 C 5
67
5 7
68 M 1
>
8 <1 :
?C> 5
71 2= 8
? 57 =
T
3
‚ Œ|
61
? 67
C
24 8
<>>
3
M?77
7
? 67
5
B @
21
M71
<1 :
57
T ?1 :1
67
579 2= 5 8
26
8
91 8 G>1
?: 1:
71 3
>
j 1 :8 5
67
52= 8
4=
= ?> 5
;
5 2797
6
>8
8 5
M?>7 2=
7
3 5 61
>
F4 8 5 8
:7 >>
58
:
M?7 p M :
>8
3 5 E:78
8
47 H
1
<2 ;
9
2= 5 8
9 @7
B
5
67
55= M1
<:
4> ?7
= 7
< 1
5 9
H i 67
B>
2
=
E=
h
M> 8
?4= B 7 :
?7 3
7 5 67
<?9 M
1
M>7 8 <7 :
91 =
: 5;
>?1 : 67
9
F7 1 :
?7 ?1 :
?= ; C<
47 247
SG @ 5
E7
7 9=
>1 47
3 >
5 >
61
5 4?1 :
5 B :7
? 67 21
7
<?9 G @
2=> 8 2 67
!
# $ % &
! ! "
M71
fg8 <1 :
7
5
> 8 ?= ; 2= 8
=
41 :=
F= ;
2 @7 8 B
> G
M?77 5
67 9 68
3 <2 ; H 6
<2 ; 9 HH
9 2= 5 8 3 =
<
2= 5 8
91 2 @7 C7 5
A 5
H :: 2= 5 88 F 67
?= I
98
5 61 <? 5
67 > 7
<2 ; 5= H
9 41
2= 5 8 7 g
<?>
7
1 5
E= F 61
WBM7 ? 5
=
5 ?C
68 7
> >
> 8 G> 5=
5
67
91 ?1
@
S>7 ?> 57
71
9 D4
6 8
(
#'
!
2
58 1
47 2= 5 8
>9 8
1
::7
?@
7
<?9
!
#
67
5
G
C<
2 56
=
?1
8
=
@
M7
; 1
<1 :
92= 57
5
> 8 67
> 5 JF7
>= ?
7
21 ; >>
2= 8
M71
<1 :
H
2= 5 8
T
= ? 67
; 71
2>=
1 427
<1 : 5
2>1
2= 5 8
M7
S
?1 :7
>9 8
G
?= ;
9 68 2
6 2=
29= D
> 8 ? 57
> 5 24
>= 8
1
21 ; 2= 5 8
f()
‰| z Š|
f(3)
1
5S
G7
21
5
::
>8
247
C<
?1
91
B
H
'
f()
€
B
7
?= ;
:g8
G>
7 58
?7
2 Z67
2 61 M7 H
?
2C 8 7
1
C <2 ;
5
67 9
9 5
??= 2= 8
F7> 91
2= 1 ::
9
2 @8 97
C= >>7
?>=
79 EU
9
2= 5 2 61
F 5= C7 B
>
= 58
; ?>= ;
5
67
> 51 41 :
9 g ?1
C<
247
B 5
58
9
C?=
8 H
61
>
F4 8
91 5 fg8 :
7 31
47 1 ?7
:1 > 51
> 5 9 g 2C= 8
>8 = 28
2 h= F ; 5
F1 67
F 5= ?7 9=
i 2>= F4
<
Fs
2= 3<?= ? 57
>V
? 57
@7 47
24 8 B > g ?4=
1 5
2= 5 8 67 H 3 r
9
= 1:
;1 :
>
<2 ; 9 51 g
9
2= 5 8 61
>
91 5 67
F
:: ?
5 F=
67 ?7
F 5= 5
= 35
E 61
97 U 55
5 67
>8 =
51 E
27 g 79 U
5
5
H>
n
return n * fac(n-1);
n * fac(n-1)
n
z Š‹
8
2=> 8
>
2 @=
=
2= 5
39 :
2=
<>
47
58
47
<E
15
>= :
?<9
7
? 57
>
= := g
6
>8
5
F=
?
F 67
2C1 8
1
9g
5
t
N
8;
'
& ' $ - , ( ' / # #
& & / ' $ . - )
$
# ! & *
& & '
& & +'
' , " f()

::
B 9g
28
2A
> 51
91
5
;
67
> 51
=
8;
2= 5 8 2 01
5= 3
E7 41
5
2 @7 A 67
1
4
7
5
F1 @ 91 8
F :
2
?17 <9 ;
2> 8 2= 5 8
5 8 ?>1
G>= 27
2
1
<? 5
2 @7 A 1
8 ::
2= 5 8 3
2 @7 A
?= I 7
J7 @
1
F4 :7 ?= ; B!
21
47
3 21
28
K C
L 5
5 5 61
2 67 5
< 67
4? E7 <2 ;
D9
1
‚ z ……
67
=
>7
1
T >=>
6
>8
61 3 E
>1 19
:: 97
5 2>>
7 @=
8
O
M>7 8
3:
E7
2 @7 A
7
1@
>
=;
G := :
7
?<9
?
291
fac

{|  …
‚ „}
|€ †
€ y ‡| z
~| ˆ ‚~‚
„ |ƒ
}
† |„
‡| z ƒ …
Ž ~ } …
|‚
„
|‰
}z
€
z
~
~ |„
<
=
2= 8 5 68 ;
2> 8 5 67
5
5 2> 51 ?= ;
2 67 8 9 41
7 :
2> 51 E7 ?1
9 9= C<
?7
47 247
F71 >
F 57 GY 5
?71 F4 2 67
?=
2>= ?1 8
8 95
F 5= 3 : 1 :
:
= 6@8 21>
; 2 @7 =
5 B
67
? 5 67
> 51 <2
9 g 5 8 <2 ;
:
21 5 9 5
2 67 2= 8
1@ 7 [
G ::= > 57 ?=
5
> 91 @ 67
5 : <2 ;
67 :
?= 61 9
5
2C 88 ?> 57 2= 8
1
: 2 58
<2 ; 41 8 ?>7 :
9 57 7 ;
2= 5 8 H m@ <?9
91
>
5 M8
:: 5 7 :
5= 5 61 B 3 _
F
::
2 8 7> 5
F H :;
?
28
T
F9 8 68
>
:7 > 8
21
95
5 39
61 1
41
H
f(3)
f(n-1)
f(n-1)
|€ ‚‚ {
z |ƒ
~| z x€
„~ z ~

€
|
?=
1T Gg B
E:7 8
5
u 68
> 15
G 6=
C21
> 8
H
G 6=
G
fac
9 k7
F= :=
;
// POST : return value is n!
unsigned int fac ( unsigned int n)
{
if ( n <= 1) return 1;
return n * fac (n -1); // n > 1
}
z xy w
H
5
58
6
24 8 >
1 7 \[
57 D 9
? 57
=
2>
7 @=
H
=
n!
ˆ ‡ …|
67
1
A <1 :
5 2= 5 8
<2 ;
9
2= 5 8
7
2 @7
M7
>7
6=
<2 ;
9
2= 5 8
S>
1
<2 ;
9
2= 5 8
M>7 8
?<9
7
=> :
1
291
7
M7 61
?
G
n 1
n>1
B 58
21 <4 :
F 58
@
51 g 91 :8
28 5
2= 8
C F=
5
67 ?7
F 5= 1
? 5=
=
E7 U >1 8
9 G:
=5 1
F h; 3>7
F= M 1
> i <1 :
8 57
H 5 ?@
A
>
H 5
<v
2 55 8
2C1
=
79 EU
2= 5
S
2>= 8
8
1>
fac(n-1)
B
Infinite recursion.
>
2>= 8
B 9 58
2> 8
97
1
? 57 ;
1
B ::
1
<2 ;
9
2= 5 8
91
::
>8
<U
>
21 5
JF7
?
7
>
2=> 8
R
RQ
1,
n (n − 1)!,
M>7 8
<2 ;
9
2= 5 8
G>
7
M7 61
5
67
>1
47
8
<>>7
1
G>
67
=
JC7
=
2 5 68 2 P
2
Z8
? 56
7
<?9
5
F
F1
7
67 8 ?1
> 21
1
41 ?
91 5 8 79 G3
<?
:
> ? 67
2 @7 A M7 8 27
8 <2 ; 8
2= 5 8 9 5
? 2= 5 8 67
=;
<2 ;
41 ?= ; 9 5
9= 2= 8
M7 E= F V
H 4< >>9
2 5 8 F=
C WB7
21
Y2
8 @
1; 5
B 9 5 5 61
5 F>9=
6
>8 7
2 @7 A 2 8
9
8 <:
2= 5 8 @7
J7 >
19 5 67
5 <2 ;
3: 9
41 2= 5 8
59
67
> E=
5 @
67 H 3
5 7
? X7
n! :=
n
‰x
void f ()
{
f ();
}
JF7
?
7
B7
? X7
41
3.2.1 A warm-up
‚
2= 5 8
n!
> 8 H ]^
5 H ]
67 S _
>? 5 8
6= 8
57 >71
G> 5 >
1 3 5=
3 = G?
?9 ; 57 8
71
2 5 8 G2 @=
C21
<2 ;
28 9
2 A 2= 5 8
8
? 57 91
79 G ::
<? >
7
? X7
3.2 Recursion
f()
fac
3.2.2 The call stack
2
2
n
n
`
d
e
d
cb
a
a = (a
M @8
b)b + a
5
67
8
97
b)
gcd
b <b
(b, a
0, 1, 1, 2, 3, 5, 8, 13, 21, . . .
b <b
gcd(b, a % b)
b) =
(a, b)
61
7
F
M @8
?>= 8
F=
O
OO
O
OO
O
OO
O
OO
>
6
4=
K
@
L
K
L
M @8
21
2 \8
97
>
4
6
M @8
>
E=
55=
4=
@
19
2= 5 8
97
<27
>7
M71
<1 :
2= 5 8
F 5=
5
5
61
58
=;
G ::=
>
::
9g
> 51
91
_
[
]
b
d
cb
a
d
27 8
57
?C7
B>
G
7
C7
5
?1
@
6
<
F
<
F
<
F
.
a
b
b)
5
5
unsigned int
M1
<7 :
>
O
OO
b a
b
+
.
k
k
e
a
24=
4
k
M=
3>
F 5=
?
3
b
1
37
H
>8
39 :
1
::
58
?= ;
21
71
7Z
291
a
>
a
<2 ;
9
2= 5 8
B>
58
>= 8
2 57 ;
M?7
1;
>5
B >@
2
GP
?=
k
41
B 3 :: =
5 ;
67 >7 (
<27 97 > 8 #
(
2 @7 A 7 >8
2=
1@ 7
>
b=0
M>7 8
2C1
3 H
@7
:1
32
8
5
67
M71
<1 :
2= 5 8
67
F=
b
b
9 58
H>
?= I
7
8 3
unsigned int
M 1 2=
<: 2
B 7> @8
19 C
?=9 RR Q
2 @8 2
<;
C 9
5= 2= 5 8
5
67 ?= ;
<9 p 9=
:8 F
4
21 @7 <
25
1 8
:?C= C
5
67
5 8 ?C
6 7
H 4 1 57
>5
9=
F7>
F
8;
@
21 M 88 8
?>= 1>
@
C9 >= M @8
@ ; ?>= 8
=
4= B ;
@ ?1 5
2
?1 J77 67
7 1
7 9
<1 5 : M @8
3 8
H : 5 67 @7
>
M @8 8;
?>= 8 21
>= 2= @
; :
38
;
M @8
4= @7 8
@ >
H
T 4=
F> 68 @
? H
M=7 T
6
> >8
5 47
61
5 21
C9 B >
@ 5
a
(b, a
?<9
?
?
>8
5
?9=
O
OO
a
k
41
Correctness and termination.
?= I
M?7
67
O
OO
⇔
41
H
7
=
G 5;
= ? X7
F=
(a, b)
>8
F
k
2>
<27
4
O
OO
k
97
6=
25
=
29 5 8
<
?C= :
58
6
O
OO
b/k
>7
67
Fibonacci numbers.
>7
58
1
:8
2= 5 8
1
>
2>==
1
>
5
67
? E=
41
C1
?=
O
OO
b)
<27
b
(b, a
@
b
b
T
gcd
>
:1
<9 p
67
?= 5 ; 21 @7
B4
G
F
T
?
@
::
q
&
&! / ' O
OO
1
b
C9
67
<?
=
2=
5=
F1
1 :7
<>1
5
'
a
>
79
??9=
T
gcd
:[ :[ 5
7 g8 7 g8 F 67
=
f7
>
4 ?= ; 2= 59
41
@8
?= ; B _ 2= 5 8
?=
>9 8
?
E
_ 3 ?=
< 7
2> 8 B 9
5
C E
>= 3
<
47 2>
19 ; 8
C
> 5 5 67
5 <2
61
5
= ; ? @7
G ::= 32 :
8
? C
=;
41
4 5
5 67
67
41
41 9 5 8
5 1:
67
41 2 @7
A
91 5 8 8
58
2
=
:
2 @7 A ? @
8
8 79
2= 5 8 5 :
3
n!
2
24 8 7 5
1 F>>
B > 57 ?=
2> 8 = H
97 ;
4<
5 >5
67 2 8
M1 M
=
<7 : M :
7
1
= ?
; 57
5
67 24 8
>79 1
2= 2= 5 8
F
?1 @ ?=
C< B =
;
247 >=
5 :7
> 8 > 5V
E=
<2 ?> 51
@7 G 5
? @ 58
=; 6
5
4 S > 68
E7
G := 21
3
::
3
67
>
F= :=
57 8
2A
28
:
7 g8
2s
3<
3
?4=
47
2
<
5=
? 57
91
@8
2= 5 8
3? H
7
?>7
M7
@
?= ;
5
67
91
::
> 51 B
9g
>8
<;
H ::
?4=
47
a
= (a
k
4=
0
3E
M 8 21
?= I 27 @
5 C7
B > 68 > 5
5 >1
5 9 67 4? :
:7
6
> 8 ??= 2
>9 8 97 8
2 7
?1 :7 7 5 M?7
>> 3?
?= I = ; 79
5 <?
F 67 M> 8
= 7
G > 59 91
2
7 = G ::
28
@8 7 [
<9 @ 2= 5 8
61
M7 5 8 = ; M7
:
G :=
31 :
4=
><> ?> ; @
=
47 4
5 f7 _
61
H
5 4
5 41
67F
= E
> 59 32
2= 8
<@
@8 9
2= 5 8 2= 5 8
2=
; H
G 5= B >
? 21
57 8
28 @
2 5
= > 68
297
D 5 41 g
7
= := >
2 g8 5
67
C? 4
7 1
<?9 ? 55
1
M>7 8 9 5
M7 8
<2 ; H
9 2
2= 5 8
> 5 67
5 =
61
5
?1 5 ? 67
7
M?7 2 61
B
3 @
3>
71
5
5 ? 67 8
61 F
5 =
5 8 > 59
> 8 2=
>77
5
f7
<5
>
29=
T ?> @7 8
67
3 G5
> =
G 6=
?4=
5 7
61
?5 >8
7 F4
<?9 ? :7
M>7 8 79
?<
<2 ; >
9 M7 8
2= 5 8 <2 ;
9
?>1 2= 5 8
F7
?1 > 5
5 61
<9 8 ?1 5
? :1 7
:
31 >=
G47
247
1 61
E:7 5
?4=
5= 7
9?= 2 8
? ? 57
7
29 5 7
7 2> 5 8
>> C
2 61
3
a
1;
>5
a
5
3? :
7
<?2 5
(a, b)
>8
(0, 0) := 0
(0, n) = n
??9=
==
fac
4=
@ 4=
?
F
>= : >= ;
1
7
3.2.3 Basic practice
@ 79 H
5
4= 1> 5 ?= ;
@ >8 1
7A
H > 9 :: B
1
<k
:
5
>:
E3 B G 5=
5 7
67
:7 41 G H
4 3 ? 67
B 41 1> 7
>
C9 < 5 67
@ 47 >7 B
5 29=
61
5
4= 5 ?1 @
@ 9 67 C
1 <
:: 247
C9
5
@
61
>M
B
1
<7 :
>=
5
67 9
?=
> 51 ?
57 79 H \
247 3? 5 : 29 8
5 ?7 5 7
<2
C9
H
G
n
67
79
b).
??9=
H
a, b
5
F 67
T ?=
6
>8 E
> 8 :7
2 @7 A 4=
7 2;
A
1@ 2@
> 8
5 C
67
? :1 5 67
C7 ?C7
2> 5 1
1 57
<? 5 >9 5
=
21 :
< 424=
4? E7
M @8
?= ; 5 61 ?>= 8
5
(n, 0) =
fac(3)
;
@
G 5;
2=
1
<? 5
1
2:
<
2 Q=
4? E7
>8
> ? @7
=
28
7
9
27 8
5
5=
7M
1
<1 :
57
n: 1
5
b
4
b
=I
@
Greatest common divisor.
(a, b)
a
b
n>0
H?
(b, a
4=
C9
n: 2
n: 2
n: 2
n: 2
n: 2
fac(3)
n * fac(n-1)
n * fac(2)
n * (n * fac(n-1))
n * (n * fac(1))
n * (n * 1)
n * (2 * 1)
n * 2
3 * 2
6
=
;
@
(a, b) =
M @8
?>= 8
=
C9
.
b>0
@
E7
k
1
@
Lemma 1
4=
f7
Proof.
5
C9
M @8
T Y @7 8
67
:7 >
< 5 E=
>1 5 6
:
=> 21
@7 @
/ 2 A G
7 8
C9 5 6=
@ <
#2
?5
A
7
@>
241 8
C9 H
? @7
@
H2
B
FP
E1
?1
>7
5
<9 8
2= @
?B :1
5
67
C9
=;
@
G := :
28
C
C9
@
Table 5:
n: 3
n: 3
n: 3
n: 3
n: 3
n: 3
n: 3
n: 3
n: 3
←→
// 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
}
fac
b
b<b
b>0
b =
return gcd (b , a % b );
(a, b)
>5
2C=
2 @8
f
H 5
fib
?= ; 9= <2
F
5 4< ? @7
67
>
19 > 57 2 51
:: M7 @
?7 5
2
32 61
<
B
5= 4? E7
? 57
<E
5
24 8
5
1 N > 68
57
58
47
+
? 5 67
! 7
>8
MC7 8 1
H
2 E7
<>
> Z6 7
8
5 :7 5S A
67 G
21 7
G> G
?7 <=
28 : >8
2 ?@ 4
= GC= <9
5 8 = 1 6;
47 : ?> 57
2 @8 B
2 s[ G 2
>
?= ; 1 8 9 8
2 58 7
<D 5
C 58
Fi , i
f
unsigned int f ( unsigned int n)
{
if ( n == 0) return 1;
B :7
?= I
J7
1
F4
61
G5
7
C7
5
1
2=> 8
M?7
M>7 8
B 8
5
6
2> 8
2=
D?
7
<?9
C21
m
fib2
fib2
f
fib
5=
H
?
77 ;
>
1
57 8
5 <
61
H
<
>
7
6=
<2 ; :@
9 5
?
2= 5 8 7 67
?= ;
7
<
?= ; >7
9= 5
67
F4 ?=
< 28
2 58 C 8
1
C ?:
I8 79
2 E= <?
19 M> 8
9 7
2 8 ?= ;
G
5 4 <4
? E7 :1
5
> 8 > 8 2= 8
5 2> H
67 =
<> 5
51
4= D :8
2
7
;
?@
7
21 <?9
4? E7
47
7
58
? 57 8
1
M7 5 8
3:
G 5=
?
3
>8
>5
:8 <?
7:
5 T
6
> 8 > 68
2 @7 A 47
21
8
2= 5 8 B >
G M?77
7
291 37
:7
8 247
4
47 = 5
1 @8 ;
57 5 67
G3 : >7
?
<
57 8 27
9
G @= 7
2 8
>
?1 5 67
7
<?9 <>
M>7 8 4=
;
R Q 5 67
R G5
<2 ; F=
9 ?7
2= 5 8 M
=8
?= ; <>
9= 2=
7
F4 H >
< ?I
2 58 =
C 4
@ M> 8
B7
Fn−2
<E
5
7 Z 58
7
BH
H
<
>77
=
5
5 G 5 61
67F
? 7
M 7 C7
=8 5
< 2 :=
M>1 C?7
<7 : 21
= @
; :7
?>
E7 >7
?= ; 1
7 @1
5 E:7
67
<F 9=
WB @7
@1
57 21
F> 57 5 @
Y2 G 5 61
8
5 27
67
F> 77
? 8 21 @
8
= 5 J7
\; ?
79 1 5
M
2= 5 8 ?1
18
]` E:7
^ 5=
4? E7
47
?
a
5:
M1 291
<7 :
> ? 5 67
7
?=
21 7 ;
G
@ ?
57 8
1
5 :=
61
G 5 F=
G
7
421 >7 6=
8
2 51 8 ? 57 8
2 8 15
2= 8
5
67 9
M?1 =
F
18 4
E:7 < 57
> >
21 ?
;
@ =
H 45
F 67
?
M7
=8
<
>
39 :
=
F4
<
57
@
H
@
7
29 5
7
>>
?= ;
??9=
Fn−1
<9
@8
67
I8
Fi−1
Fi
a
7
5
< B
4? E7
B>
C7
2 55 8
C
? 57
24 8
1
2= 5 8
21
Fn
@
57
i
?4=
1 58
:
3:
2 :=
?C7
21
E
5
@
5=
21 H
7
9
27 8
5
1 :7
=
2>
5=
9=
1
57 8
I8
29 8
19
2 E=
fib
2> 51
<>
>8
7 @=
;
21
<
F4
4
?C=
?
F1
3<=
G
?
P;
Fi−2
27
F @7
2
fib(50)
unsigned int
2P
57
B 3:
91 5 8
5
5
68
< : > 68
>7 91
2>1
H >7
H G
T G _ ?>7
67 7
G
?4= =
41
7 <:
3
9= F @
E7
28
F4 ?7
9
?
??=
91 :8 7 ;
7 B
57
B 95
@
2> 8
<2 ; =
97
9 M?7
2= 5 8
B
9=
2 @7 A >
<
8F
:
8
J7 @
2= 5 8 4 :
97
= 32>
7
; 98
@
7
5
67
M1
8>
<7 :
1 8
>
?
5=
21
4= =
? @7 2 8
C7
1 7
= H
;
F 57 9
? 27 8
5
67
97 8 5
3F 5
5= ?= ;
7
19
fib(50)
F48
fib(n-1) F47
?= ;
5
67
F>
77
<F @
?
F
Fi , i < n−1
247
3
1
=
G 5 E7
277
7
? 67
2 ::8
=
97 5 8
5
61
5
>=
G47
G
2 E=
@ 1
9
29
3<= B < 8
28 5
?9 F 67 4? E7
71 ?
>7 ?C= <
1 2
>8
E3 4 C
E7
< U 9= 5 6
>5
>8
47 <2 ;
>M 9
?7 5
2= 8
3 B
G> := 3=
H <
1
R Q C :6
R 3F
<2 ; >71
9 2g
2= 5 8 B 8
C
1
28
41
<>9 5
67
6
G 1 41
1 91 5 8
3 :
5 <2 ;
61
5 9
2 2= 5 8
7
8 8
? 5 67 '>
? @8 79 # 5 32 : ?=
2 8 ? @8 79
5 ;8
39 : 9 5 8
1 21
:
>:
5>7 8 G E7
G :; ?
58
5 8 2 57
6
<
F
gcd
H
421
8
8 <F>>
2 51 8 ?7
7
@ <=
<
3E B >
5 2
67F > 8
? 97
?C= 8
1 291 5
YG4
7 E7
9= >
< 4< 8
: D
@
> 51
3.2.4 Recursion versus iteration
=
b)
H
8
=
T M7
? 67 27
71 2
2>= = 5
97 8
> 8 G 6=
5
61
5 4<
5 9
67
6
41 G> :=
5 ?7
67
41 5 8
91 5 8 9 E7
: =
47
2 @7 A G>
85 2 67
2= 8
<
n
H
// 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 ;
(a, b) → (b, a
@
91
1@
21 [
98
5
3:
<2 ;
9
2= 5 8
1
F:
2=
5
:: =
M;
9 g G7 8
B
JF7 ?
79
9 :8 <?
5 :8 2>= 8
3
6
? 57 8
1
2= 5 8
C
= 1
2 57 ; ?C= :
H
58
= 6
< B4
2
291 >9 8
7
?= ; 1
:
M
J7 1 :
1 <:
F 7
@ B 4 >
:7
7 21 9
8C @ 9 67
2= g
56 9
5 8 7 5 61 B
47 2 8 5 ?1
> ? @ 5 ?7
[
67
@= 97 8 9 F7
1
=3 5 : :: 17
< 3?
5= 57
>77 = ;
@
39 :
F1 4
=
F4
1
<
?2 557
9= 57
B @
F
l
H _ H 4< >=
57 47
=
>9 8 > ;
=
5
F4 ?1 67
: 4
7
< 1 J7
57 @ ?
@ 3G 7 5
? 5 6 5 47
77 97 8 :
3
5 8 2= [
B 47> 97
? @8
79
M7 A 5 :
32
58 8
4B 7
>
21
fib(n-2)
F45
Fn
4=
67
5 <
5
=I
Fn
C<
2= 5 8
41
:1
?
n = 50
?1
67
?5
21
?>= ;
5
91
57
:1
@ 4
? 56 1
= ?>
57
n = 30
1
5=
>@
2=
F7>
5
4<
>8
::
58 >
?= ; 9 51 g
G
5
? 67 5 8
7 21 6
<?9
?1
M>7 8 ?1
<2 ; H 3 _
9
2= 5 8 7 Z
> 2 @=
5 5V
61
G 5 61
M
7 7
61M 5 67
7
2>77 4271
28 >
5=
5 F?
F 67 =
? M7
M7 5
=8
< > 68
> ? 67
>79 B 7
2= 5 8 < E
H
5
>
5=
G 6=
G7
21
G
// 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
}
:: >1
57
68
5 47
67
@1 <2 ; 21 T
57
> 67
> 9 5 2< ;
5 2= 5 8 61
67
5 9
?= ; E= 5 2= 5 8
? 67
41 3 @ 7
?1 : H > 8
1 T 2= 8
>
C< D :8
27 3 : M?7
427
2
=
?
3
5 7 @ 7 71
<2> <?9 ?7 >
9 3
5 8 > <? G 5=
: 2= 8
> ?
5
67 9 M7 8 8
2
1
91 57
? 57
B
: ? 57 8
E7
42 8 ? 21 : 1
1 F7
M 58
2= 5 8 :1 @ 7
97 5 B 3 :
29= @ 5 61 2>
2= 8
@8 31 E 7 79
2= 5 8
8
> 8 FF1 5 8
>
F
> 8 4 ?71 >1 :7
5
> "
> 8 F= := 1 7A
5 5 2 P@ 5 61 67 M
5
5 ? 57 8 ?7 67
3
91 1 27 H
5
>7 M7 8 @ T
= : = 68
; 3 ; >
<F
F46
n > 1.
91
@1
??9=
F<>
5
gcd
B
F0 := 0,
F1 := 1,
Fn := Fn−1 + Fn−2 ,
=;
G ::=
H>
}
return a ;
}
// 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 ;
}
b
n
fib2
fib2(50)
F50
fib
fib2
3.2.5 Primitive recursion
]
]
]
d
e
d
cb
a
?=
\
3.2.6 Sorting
8
C7
21
#"
[first, last)
#
#
5
67
58
6
19
9
2 E=
C
8
I8
2 58
<
F4
2P
9=
H4
5
5
5 >5
?=> 1
>1 5 MC27 8
2 ::
< >7
<
4? E7 27
9
> 7
61
61
5 ?>=
4
C1
3?1
@1
:8
3
7 :
8
?>= B 7 ;
21
57
@ @
4
68
=;
?>
5
H _
=
<
2g
G=
Jp
?7
9
>7 ` 8
`
7>7 [
#
q
#
O
OO
..
n+3
2| 2{z } −3
B
2 @8
? 57
9
2 61
C7
G@
E:7
36
5
67
27
?5
78
2> 8
1
57
F :7
2 6=
7
? @8
79
? 5=
@
−3
?=
?
57 8
57
?>=
<2
Q 7>
B> <
21 27
9
G@ 7
@
28
21
5
65536
4 13 65533 265536 − 3 22
F1
G 5=
?
57
2 61
?>=
O
OO
O
OO
O
OO
O
OO
O
OO
3
4
5
9
61
?
8
Jp
?7
9
>7 8
5
32 E 61
5
1
G> V
7Z
47
M7 61 H 3 6
3<=
1
>7 g
?>=
@
5
=3
<
3<?=
28
2
3
4
7
29
? 57
3F1 E
2=
61
>=
M7 :
>
5
F 67
?
=
5
5
@
8
=
2 ;8
57
?C7
Y>
Jp
?7
9
>7 8
G 1
>1
E=
<
5
41 g
28
C
5
68
2> 8
5=
1
<2 ;
9
2= 5 8
1
2
3
5
13
@
4
58
6
E7
MC27 8
52= 8 F
2=
H> 8
? 57
?
21
C7
H2
P
E=
5
J7 6
?7
9
8
B >7>
3<=
G
?7
27
=
5
<FF>
=
>7
@
5=
@=
21
3
1
? @7
>8
@7
31 E
?>9
Table 6:
H
27 8
9
39
2=
9
7
>= 8 F 8
4
M E :7
=8 2
< 47
>
3 : >5
0
1
2
3
5
@
=> 7
2= 241
2 88
C2=
7
>
>8
=
<2 ; H
21 @
5
E:7 ? X7
7
4 G
= G7
< 21
C
6
3F : 55=
>
71 91
2 g8 59
C <F 6
5
67 2=
9=
F4 5 6
8
J :7 2>1
8
3 = 5 2 @8
; M
F1 7>
? 58
= C1
E:7 57
4 5 67
>8
2 @7 A
7 #'
1@ +
> !
5 =
67
9= 5 ;
F4 67
J :7 ?>=
2
8 58
35 C
=
Fn
? 67
58
47 H
=_
;
5
67
1;
> 57
>5
1
?C= : B
<2
? [ F?
R
<2 ;
?= ; 9
1 2= 5 8
:: H
B 2P
21 @7
7
@ B
5 @
6 5
> 8 67
<2 ; 1
9 M E=
2= 5 8 7
RQ
5
51
27 g
2> 8
=
5
2471 1 :
G :=
5 B7
61
5 2> @
5 8
67 9
<2 7
?
? @7 79
: <?
32 8 >
M8
C 7
41 3 9 :
5 1
67 ::
14 > 5 8
91 5 8 G>7 :
: ;
<2 ; 5 8
9 16
2= 5 8 ?1
2> 8 C<
= 247
F5 5
?
F
8 @7
4 8 27
M7 5 8 2 @
? 8
7 C=
<?9 ;
> H
WBM7 8 T
68
58 >
< U 7 @=
>5 >
0
1
2
3
C
2
@8 <
?7 t
27 4? E7
1 5 2> 8
?C= : \
7
58 9 5
6 2= 8
4>
?= ; H o
]
5 H 21 o
67
>1 @
\
4F7 79
? 5
= 2= 8
E:7
H o
4 BH ]
^
41 G
3M 7
?1 61
M
31 7
1
:= ? :
5 71
T 3@
67 >7
2
>1 7
47 5 61
8
?> 5 55
<7 ? 67
?= ; 2<
?>= 5 8
2 5 8 47>
=
C ;
20
15
8
G < 5 56
> B 4>
58 > 1
2 68 ? 51 G>
5
J p E G7
?7 321
9 1 ::8
>7 8 3j : @8
2 8 >9
=
H C2= M?7
T 7
67
>
> 8 = ; ? 6=
F4 5 5
:
:7 67 H 3
> 5 h=
2= M
7 = E8
5 <
61 >
5 ?>= i
5
67
1 25
< 8
5 C
H
? 6= 1 :
>9 ?C=
21 5 8
6
2 5 68 4>
5
g
= 5 61
;
> 8 3<=
#
41
# 3 61
M
#" 7
<F
f7
?C= :
1
5G
M7 61
7
5
m
24=
47
9=
61
>
4271
5 G 67
>8 ?
23 ;8 2=
C C
>1
5
8 67
4 8 41
M7 5 8 5
? 67
7
<?9 41
9 58
M>7 8 1
:
H <2 ;
9
2= 5 8
?
F
f
<27
BW97
21
::7
2 A >@ H 5
67 M 8
27
>
41 5
::7 67
> 5 >7
7 <
:7 27
247 97
=
=5 M ;
; 1
5 <:
67 7
>7 > [
<27 5 :7
V
97 >1
>
Y <>
2 5 67 47
8 5
2 5 8 3 67
?1
? 57 7
9 28
2 61 57
C7 ?C7
> B >_
5
6
>7 8 # :7 247 #
5G #" 58 6 ?
5 A
67 > 5
:1
8
F
5 ?2
67 8 2
4 8 2< ; F9 P
M7 5 8 9 :7 8 5
67
? 5
79 2= 8 E7 ?71
<? M 9=
:
1
M>7 8 <7 : F4 D 3
<
<2 ; 2>= 57 5
9 7 @ 297 6
2= 5 8 9= 3 E
1 <? 5
> F4
B
< 41 3
57 9 5G 8
2> 8 2 68 1
F ?71 >
?
19 7 E7
J 7 7 :8
97 5 8 1 M7
9
2 8 [ 5: @
9 3 5 5 61
< : 67 5
2 @8 F? 5
67
C 8 <2 ;
C9 4 5 8 9
@ M7 8 5
? 2= 8
79 G>
21 <?
> 6=
@ M7 8 >7
2= M
1
9= _ 7 < :
H 2> 7
47 P 2>91
? @7
=; 7 2
B
8
4 @
?
F
f
>7
= 5 >7 5
; :7
5
67 247
247
7
?A
421 >7 5
8 :7
? @7
2
= 47
; H 5
5
67 T
>7 67
<27 >7
97 <27
> 5 297
2 ::8 G=
77
>
> @ ? 51
5= 5
G
E7 >
?>= 5 8
57 5 6
@ 67
< k 4>1
5 :
5 :7
6
> 8 >7 5
> 8 :7
2 @= 247
27 8 B 5
1
5 >
67 @7
>1 ?> 8
7
G47 B @
1 <E
3S 5
5 5
67 67
?
8;
? 57
5P
<?2 5
7
@
G @ <=
5
7
D :: 5
2 g 61
G= 55
2 ? 67 H
J7 ?71
1 7
F4 9
=
:7 F
4
> 8 < 51
5
67 E
:7
2 E8 <2 ;
?1 9
3 2= 5 8
q > 5
61
# ?1 5
27
=
F
5
?
8
M4 5 88
?7
79
B D <?
>
F4 8
:7
21
M>7 8
H m
return f (f(n -1) - 1);
E7
291 <>>
2
? E7 4 8
71 C 5
j7 :8 5 61
5
1 @ 67
> >7
=; <
G ::= 27
9
H > 78
>
@7
?>9
265536 −3
>
// 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));
}
41
A
:7
21
8;
m=0
m > 0, n = 0
m > 0, n > 0
7
67
:8
>=
47 m
9
?7 g
4
5 2
m=4
B
>
>5
5
6
>8
1T
E:7
67
2 @7 A
7
@
3E
A(m, n)
m
? @7
1
B 57 H
<E
5
?> 51
2 58
?C
=;
4
57 8
T
1;
7 95
_
H m 5
61
> 5
?1 : 5
71 > 68
<2 ;
32 @ 9
= 5
57 2= 8
1 @ 2> 8
E= =
B M7 5F
?
58 8
82>
4
79 M 5 88
7 ?7
8;
?>>1 79
<?
3
< E M>7 8
25 ?
= 7
5 <
<> ?7 8 H
9 >
27 8 F1
?
5 =
5 =
61 ;
5 [
5 5
6 61
> 8 5G
2 @7 A 7
8 2 @=
2= 5 8
5V
? 67
MC7 8
(a, b)
>
4=
<
= := g
79
<?
5P >
M
41 7 8
32 3 :
= <
5 >7
E7 >
8 G
4 8
47 5 6
1
1 @8 ?1
57
: C
39 <
247
?1 :7
5
5 5 61
61
5 5
5 F @7
67 27
??9=
@
F7> 2>=
2=
2 @8 H
C
RQ
R
<2 ;
9
2= 5 8
?
f
B N
G1 :
1
3>
? 57
24 8
1
57
>
<E
5
Jp
?7
9
>7 ` 8
1o
>g
>
3<=
5=
>
G 6=
n
6
1 ; M?7
>? 57
3
2 8 E1
1 9> 8
>1 8
A(n, n)
A
4<9
A(4, 1)
A(4, 2)
A(4,3)
? @7
M1
<7 :
H>
?= I B
<2 ;
9
2= 5 8
3 A(m, n)
2 :=
A
C?=
20, 000
M1
<:
=
8
C?1 7
5P
>
291 H @
71 : C7
28
9 @7 @ J7 5
8 3 ?
19 ;
41 H 7 5
: <=
5
47
@
E7
C 88 # 3 :
>
G 6=
>H 5 / ? :1
2
< k E7 H C7
5
5 1
61
=
5
67 E <
5
91 5= :7 219
:: 9
5= F= > 5 8
?
4 9 ::
< =
GC=
57 F
4
>1
<
G
;
57
?> 57
2 ::8
5
= Y1
2 61
5 ? 57 ; B
?
57 1 1
21
24 8 B :: 5 :6=
3F?
1
<
8
C
G 57
48
6
5
M7 5 8
68
?
52 8
>
68 61 51
79
21 > 7 g
<?
2 h= >
>M 8
3=
<?>
7
3 : F?
<2 ;
?>7 E ?1 i
M1 = 2> 88
9
<2
2= 5 8
C
E:7
@ 3:
?7
F

 n + 1,
A(m − 1, 1),
A(m, n) =

A(m − 1, A(m, n − 1)),
2 @8
2
<E 8
5
3 1
G7 ; >= : 21 [
2 :8 2 @1 @
5
7
68
=> ?C7= > 8
9= ; < F>1
> ?
@7 5=
H B = ==
:
2> 8 5 ;
97 61
5
58 9
8> 21
71 2
=
3> 5
5= F E7
27 ?
9= 8
@7 4 5 8
M8
5= [ ?7
= 7
9
9= _ ?<
F4 M> 8
7
91 :8 H _
57 79
9= @ <?
F4 2>= 8
< 8
51 >1
2= 5 8 F
G=
G > ?7
58 < ;
6 :
M?7
n
m
f(n) = 1
E7
=
<2 ;
@
@ 25
F4 8 8
?= C1
2 51 >7
<
F= 5 279
?7 7
1 =
2= 5 8 M 1 ;
H <7 :
?= I 2>
J7 < [
1
F4 4? E7
WB :7 B >
1 J 57
F> B
79 >7 5
8
9 A 59
M1 H 2 _
8
<7 : 5=
921 1
2>97
21
}
n
n
n+1
n+2
2n + 3
2n+3 − 3
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 )
{
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
^
]
o
]
d
e
d
cb
a
z
67
?
> @ 2 @7
5
?7
?
5
;
58
Gcomp
57
@
n Gcomp
;
B
=
47
<2
? 67
<
;
58
5
5
5
61
58
5
T
l
MC27 8
?
21
C7
?= ;
1
5 F1
? 67 8 ?1
2 ?5
< =;
4? E7 4
5
67
F> 8 19
?
F= <1 5
?= :
?>=
2= 5 8 2 5
1 B 8
: C
5= < E
15
1 ::
5 1
4= @@8
> 5
Y 1 5 2= 8
9 1
?9= F= :
2 @8 ?7
1
C 2= 5 8
5=
= >
<? ?1
7
1 h9
E=M 67
7 F1
2 :8 2 i
7 8
= 5
?1 ; 67
2>7
C<
247 >7
5
61
>5 5
n
D 8
=
H 2
P
= 8
5? >
67 5
G 2 67
?= <
B >@ 4
? E7
H
6=
:
@
? 5 67
7
?= ;
27
=
5
41
? 557
<
>
67
E=
>1
7
31
G
291
61
9=
:
H m
>=
<?
;
?= ;
M?1
=8
<
M>1
<7 :
>=
<@
>7
5=
2 8 C7
?5
@7 8
51 @
B :8 = ;
G 5
?7 2 67
?7 2 8
;
21 8 ?7
? F= :=
=;
Y
49 G 6=
1
2 ::8 M7
?7
2C1 B
2>
32 9 8
2= G 7
?5 7
M8 G
1 8 21
:
2> 51 55=
? @1 21
1
@ :
? :E8 3j7
?1 5
3 67
<2 ; <2 ;
9 9
2= 5 8 2= 5 8
2 8 21
7 @7 1 @
@ ? 57 ;
M7 61 61
M
5 28
67
1 C91
2>97 ::7
2 @8 @
5
C 67
2
>7 < ;
2<7 9 5
97 2= 8
7
<
57 h
>5
91
B G7> i
7
<
>7
5
H ?= ; 67
<U
7B
> 41 4
5 E= :7 E
F> 68 B M 7 @
? G >7
?C= 79 <27
1
67 97
4 G9 g
7 @=
>= 67
5
? 5 67 G? 67
2 5 68 27
G= B
C>
Z H
? 67
H
@
;
<2 ;
9
2= 5 8
? :E8
?1
61
7
=T
9
5
79 EU
>5
5 =
67
8 H
2< ; 427
9 >5
2= 5 8 21
B
@
5 9 67
67 g
58 5
47 5 61
5 1:
61 :
5 5
5 8 > 68
51 8
7 g 2>
> =
5= 5
J 7 2=
79 3 :
< ?C
57 7
F1 3 5
?
67
?C= B ?=
1 3
G4 :7
<5
58 >
6
5 41
67 g
=; 7
G ::= >=
2 8 47
J7
C F
?7
7
<?>
471
5G
3
67
? @1
2> 51
T
? T67
7
>1 8
>= :
1 28
<2 ; ? 57
9 9
2= 5 8 2 61
C7
>
5
67
M1
<7 :
>=
2= 8
57
@
5=
3E
58
G> 5
=
?1
C<
247
>5
F
79
B3_
1
9=
F4
?1
2>= 8
? 5=
?
3<=
P;
2 5 68
g
1
E=
<
5
?>=
G 5 E7 2
727 5 8
C
G 5 ?4=
= 7
7 9
:7 =
F
427 4
9 :8
>5 1
57
48 @
C M1
65
M277 <7 :
>
:[
9= E7 27 g8
47 1
5 47
67 2>
2> 8 8
1
C :7 57
F :7
4=
>
; 5 2 6=
58 7
B D 47 D @8
9
41 g 2=
2 8 <>
C 24 8
5
67 C
9= F=
F4 ?71
?1 2= 5 8
2>= 8 H
2
9= P
<2 <>9
21 5 1 6
M277 2>97
?1
=
B
4?= 8
7
F1
F
?
F= 41
?
1 8 371
57 5
<F
471
1
><? :
7 4=
= >
7 ; M7 5
?
9 7
27 8 3
9 2 5 68
3 C
=
Tcomp
B >@
2=
2=
>79
2>1
<
24 8
24 8
1
?C=
F 67
=
47
<2
>= E
<: B
? 57
> @ > 8 1 67
Time
?= ; 2 8 [
24= 2>79=
7
> @_
C19 8 @
= M8
F4 @7 8
5 8 8 ?1 @
47 C19 2>= 8 E
28 =
3
F F H
? 4?1
19
8
21
97 5 8 2>=
@
8
57
> 8 ?>1
::
5? =
67 <2
<>
7
>
?= ; @
G 6=
7
2 8 H o^
?= ;
241
7 @7 1
@ ::
3
n
>8
5
3
5
1 ; F @7
?> 57 27
5h
67
? i 2 5 61 2>= @
<2
2= 5
58
F 67
47 M 1
2 8 :1
< k 51 ?= 5 ;
5
G 8; C79 B 4
7 F= 5 6
4 >8
= := g < > 8
1 ? 57 ?= ;
G 5 ? ; <?>
=
61 4 H 7
5 5 2
5 67
67 G 1
1 27 5
4=
?C= :
5
85 7 5 8 ?2 @7
6 6
4 297 B v
7 @= <? 5 5 Q
G>
3 67
7 H 1:
291 ? T67 ?C=
8
2 A 7 56
2> 8 G4
1@ =
? ::8
471 <>9 <2
<?> 5 6
7 2 68 4<
9
=
; C 6
>
1
n
F 5=
77
H Q
?C=
H
1
E:7
2>= 8 <>
>
[ 4
?41
9= j 8
7
F4 >
?1 5 67
?
2>= 8 7
> _ <> :
19 H > 5
?9= ?= I
2 @8 7
M
C ?7
5= 3
M1
E?>7 <7 :
M1 =
;
2= 5 8 B
?1
1T
int* q = p
24
=
n(n − 1)
1 + 2 + ...n − 1 =
2
?
F4
109
10−9 n(n − 1)/2 Time
sec/Gcomp
4=
while
F 67
v
Tcomp
2=
n−1
7 51
M1 @ E:7
<7 : >
G 6=
>=
; >5
H m 61
5
F> 2 5 67
?
7 <
9 @8 4
57 ? E7
1@ =
E= >7 ;
B M7 29=
5 @
? 67 F?>
<2 7
T
Tcomp
C19
n
1
*q < *p_min
>79
H>
47
&
#
n−2
4
D
47
58
24 8 5 61
1
2 5 58
8> 8 F>
5 FC= :1 H
67
5
9= ?71 ?= ;
D
F4 2= 5 8 24
8
?1
2
82>= 8 F @7
2
5 7
67 2 @7
2>7
H 5
>7
5
61
5
H
8
=5
7 Z 99
291 <?
M>
M277 ?7
3
B
J 7 ?7 ;
19 <
5 : 27
39 5 :
=
<2 3
<? @
5 28
5
2 67 C1
< 91
4? E7 ::
5=
@=
?
m <2
minimum_sort
? @7
x
29=
47
>=
58
n(n − 1)/2 + n
c1 n(n − 1)/2 + c2 n
?= ;
5 =;
67
? A <>9
> 6
J7 5 9=
7 F
<9 4?1
2= 5 8 2>= 8
= B>
;
5 F @7
67 2
7
2 @8
C
> 51 2=
57 5
247 2 67
5 <
5 4? E7
67
?A =
>5 7 ;
7 :7
:7
2
247 47
5
5 >
>9 8 5
=
F4 5 61
?1 ?17
7
G @ 5=
5 8 E7
1 6 ?>=
:: 57
H 2@
P
while
B 5
2A
1
B 3G ::
7
M7 61
2=
7 B
9=
F4
?1 = @ J 7 @
> 7
2>= 8 2= 9
B H < B
21 2 P 2= 5 8
B
@
5 5 67 5 67
61
5 >7 >7
> V8 29= 29=
H 5 D@
@
7 Z D 5= 7 :7
5? :1
67 > 247
7 J7 5
?= ; 7 2 5
7 <9 9 8
=
M7 61 2= 5 8 F
4?1
5 = 7
67 ;
= ; 5 67 G @
G ::=
58
28
16
::
C
5 <>
67 99
77
2 @8
<>9 C7
97 :7
7 2
2 @8 47
5
C7 H 2>
:7 P
247 5 67
> 5 >7
21 29=
std::min_element
…
„
|‚‚
@
?@
1
9 58
? 57
5
57
247
> 51
std::iter_swap
~|
67
<1
5=
$ #
&
(
#'
n
‚x
€~ z
F= ;
?7
1
2= 5 8
2>
77
@7
@
5=
7
?1
F4
n(n − 1)/2
B 32 5 :
1
47
3: B
? 5 67
minimum_sort
‚ {x
}|
ˆ „| z
=
4? E7
7;
7
<27
?
?4=
5
68
2>=
7
>8
M71
<1 :
57
@
M277
Y
8
}
>8
x
z{
z
<
c2 n
„
~~
‡
|} n
~
B
<
?= I 4
? E7
? :1
=
C7 F= ;
?7
5 1
67 5
2 :8 2= 8
?71 > 8
>
? 57 5
? 67
4 7
?= ;
7
2> 8 1
7 5
C : 4=
C 88 > 5
E:7
9=
J>7
2C 8 7 F
9 ?7 Z
247 < 57 ?= ; 3 6
G @=
5 2= @
47 7
3 : @ F>
4< 7
58 9 6 9 8
G 47 :7 91 A
B > _ ?>> ::
9 68 G?= 7 ; 39=
6
<27 <2
41 5 8
5
3 F1 6 5 : 5
F 61 F? 3 [ >7 67
F
?= ;
27 J= J7 9=
8
F
<F 41 F1 4?1
57 4
5= 3 : B :7 2>= 8
5 5
67 67 > l
>1 @7 k7
4?7 ?9 :1 91
<
7 ; 1 >7
5 8 < 2= 5 8 21
2
47 79 > 3
>
51 =
21 H 3 57 ? 5
67
@ T6 247 F=
8
5 >9 5 ?7
67
1
JF7 2=
? ?297
2= 5 8
7
> >
>8
2=> 8 5
D78
67
>>
1
minimum_sort
ƒ€ {|
5 5
H > 2= 8
1
2 \8 5= :
97
5
67
58
47
8
2> 8
<?2 5 5
F 5 61
? 8
F= >
?= 2 E7 8
2= 5 8 CF
1 2>7
:
5= G 5
5 58 B
67 6
? 5 67
7
?= ;
7
29=
9
<:
@7
5
61
5
5
67
5=
51
2:
291
7
H
67
51
2:
5=
T
}
29=
Œ
?=
F=
?
F E7
::8
GY
>5
2> 51
n
p_min = q
++q != last
€z
‚~ z
:7
247
7
97
G
T 25
6
>8 <
F4 8 4
? E7
7 :8
> F> 8
5 ?>
67
= ; F=
G ::= ?=
2 8 2= 5 8
SC 1
8; 5= :
3= 5
< 2 67
417 <
<?> 4? E7
7
5 =
? 67 9= ;
<2 F
4
5 8 ?1
47 2>= 8
=
5; >
G 67 G 5 E7
7
6= 27
:7
?>= >7
2 5 8 <27
C1 97
7
?C= : :7
85 247
6
4 H >5
?>=
minimum_sort
€ Œ

>7
<27
Ttotal
„ {|
5
c1 , c2
c1 n(n − 1)/2
n
‚
{|
| z |
7
? 67
<>
2>= 8 2 5 :
8
> C
E7G 5 8
5 47
277
?1
F4
9=
Observation 1
€
އ y


{x
~†

~€ z Œ
z …
€„ y
„‰
|€ } ~€ |€ z
} z
„}
H4
;
=9
67
9
27 8
9
3=
;
5
67
7
5
?= ;
? 5=
91 @8
2 @8
C==
8
1>
2>= 8
>
8
>7 5
B :;
5
6
2> 8
<
4? E7
?1
F4
4
5 8 ? E7
6 =
2
<
?C= :
1
while (++ q != last )
if (* q < * p_min ) p_min = q;
// interchange * p with * p_min
std :: iter_swap ( p , p_min );
Ttotal
main
0, n−1, 1, n−2, ...
minimum_sort
0, 1, . . . , n − 1
int main ()
{
int n = 100000; // number of values to be sorted
int * a = new int [n ];
std :: cout < < " Sorting " < < n < < " integers ...\ n";
// create sequence : 0 , n -1 , 1 , n -2 ,...
for ( int i =0; i < n ; ++ i)
if ( i % 2 == 0) a[ i ] = i /2; else a[i ] = n -1 - i /2;
// sort into ascending order
minimum_sort ( a , a+n );
// is it really sorted ?
for ( int i =0; i <n -1;++ i )
if ( a[ i ] != i ) std :: cout < < " Sorting error !\ n";
delete [] a;
}
return 0;
Gcomp=
]
u
]
d
e
d
cb
a
H
97
<27
>7
<> 8
? X7 1 :
5 7 j7 8
61
F5 > 8 >5
?7 G 6= 67
?= ;
?
47
4> #/ C7
5 " F> 57
67
1 H
M7 E= 9 21
F=
?7 E7
1 ?
2= 5 8 71
:
= j7 8
; 2@
?47 8
2C 8 R Q
R
GC 5 B
= 1
?>= <>>
57 24 8
@
>7 C 5
<27 61
G5
97 7
2> 8 61
5= M7
2= 1
7 <2 ;
?>= 9
57 2= 5 8
@
M
H
67
1
::
;
>>
7
=9
I8
<?C
7
`
CF?
2 58
?>=
M?=7
5
:
merge
// 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;
5G
61
7
n/2
// copy new deck back into [ first , last )
[middle, last)
x x
x
x
merge
n/2
[first, last)
n/2
x x
q
q
&
/
/
9;
4
6
4<
?>=
5
8
24 8
#
D4
#'
# (
S
^S
^u
H o
S
H o
^
H oo
ou
H o
o]
oS `
]^
S
H o ^ `]
o]
`
]
u
3
2
1
2> 51
29=
=
3
5
8
2= 5 8 1 @ H
= M E=
; 7
H
P;
1 3=
> <
2 E7 8 61
M
C 7
? 5 67
7
>8
?4=
7
5
2 61
2=
7
7
:7
247
5
5=
?>=
B 5
5
67
<2 ;
9
2= 5 8
F>
:8
>5
5
? 67
21
C7
P;
E7
5=
5 =
2 67 F4
J 7 ?1
B 5 8
21 2>=
>
@
>= G 5 E7
7
7 @= 27
>
5 >7
? 67 <
<2 27
9
58 7
7
47 :7
H
247
5
H>
T
6
2> 8
<
4? E7
4
4
6
A >7
5
>
1
?1
5=
>
?71
F
F1
F
?
F=
? @ ?=
<F
5
:7 2= 8
>? 1
= ; 5= :
42= 5
7 2 67
9= <
<: 4
2 ? E7
<1
2
1
M7 61
<
3C
:=
g
n/2
2
3
5
F ::8
?7
97
M7 8
5
67
2 @7
67
<2
>1
9
27 8
H 5 7Z
B 1
:
B >=
>77
2> 8 5 61
= 5
5 ?=>
? :1 2 5
8
C7 2C
E3 <
5= 4
@1 ? E7
3 V <>
> 2
2> 51 > 8
C
? @1
#
B > @ < E #
5 #"
5= ?>= 5 FF1
5 7
61
5 ?1
241 > 5=
32 E7
< F?
4? E7 7
55
> 32 8
51 7
7g D
>
4
6
1
21
9 @7
5
=
[first, middle)
28
5=
G
@7 7 = 5
2 ?
<F @ 4 8 21
B i _ B ? @7 C7
21 ?= ; >
@ 21
3?
7
> 8 21 :
5
67 <
? :1 4
? E7
21
C7
>2 5 B
@
8
57
?C7 > 8
5
> 67
41 >
? ::7 41
?= ::7
7 2> 5 8 =
<1 57 2 :7 ;
: ?C7
5= ? C 5 6
C7 >
1
h? [ ? 57
= ?= 21
<2 7
@7 <1 @
@ :
G @= 5=
H
2
i _ h [ <>
5
H
?
H3
>
4? E7
<
2
?= I B 5
G
21 _
5 7
6
B
8
@ G> 291
4< 7 7
M
F 5 :8
? @7 27
:3 M 7
8
5G 8 ?7 > 5 8
= ; 41
58
6 4 57
@ 4?
?>1 E7
7 = B
1 ;
:
4= C1 8 B
> 5 9=
G5 F
= 4?1
@1 8
3 2>=
H> > B
[
B u
5 4?=
67
58 7
47 2 5 61
5 2=
61
5 7
G 5 8 6=
= <?
<
:
@
51 g M27 8
7
5
5= 61
?>= 5
5
1
B >>
3<=
G
7
=9
5=
9 g8
>5
7 B
_
H ^ ?>7 E
T M
? 67 1 5
7 2= 8
<>
2 5 :8 5
C ? 67
7
B <?
78
>79 2 @
2= <
H o
2
3
5
?
FC
G
T
F 67
@
? @8 ?1
79 1
@
B 5: C 8
3 4
>< E7
E 26
M @8 8
8 @
@7 5
67
2 5 88 #
5= /
> "
14 ? ::7 1
<F> ?C= :
?E 8
= 56
E:7 4
8
4> > 5
6
5 S> 8
61
?1 5 F1 8;
7 ?
71 =
?7> 8 E:7
5= 4 8
>= > [
5=
B M7 : =
n
8 P
m >> ;
C7
1
4
>7 8
> >
2 P 5 8 ? ::7 M27
2>
B
5 J 7 32= E
67
E=
27 5 7 5
F> 57 H M1 6
@ B
<7 :
59 8 5
>
1 67
:
>: 1:
5 ?C=
67
21
<2 ; 5 68
@
9 4?
2= 5 8 79
<?
?1
7
M>7 8
7
:3
<
2=
1
?>=
:
5=
5 5
67 >
G5 5
B
67
?= 7
21
21 :7
=@
C7 247
> 5
?G 5 67
2P >
@7
WB>7 8
=9 ?>9
8
5
4 E7
67
247 @
?A
2 58 E
>
3
M1 5
C E=
5 5
<7 :
67 6
21
?
E7
1
F 67 : C?= :
<> 5 8 2>>7 p
> 6
5= 4> 1 5 8
@= 7 :g8 3 ::
5 8 ( 5 67
(( >1
"
47
?= C<? A
7
?>
7
" <>
? 5:
H =;
2 Q1 4?
G <2
7 22
@= 8
C
E7 =
5? 57 ? 5 67
l G
7
B G7> D ::
2g
7 G=
291 2
B
21 > 8
F
?@ 4
79 :7
<? ?>=
2=> 8 2 5 8
C
Figure 18:
2C 8
B
:1
<2 ; H
9
2= 5 8
? 557
5=
>=
M7 :
@ C7
? :1
1
4
6
?47
?> 5 2<
1 ?
@7
C8 >
65 5=
G?= ; =
?1 5 @
67
H @
9 @7 g
21
@ 5
C 8 2 67
8> 4 8 F
<
G 6= 2> g 5
G= 5 67
5 2 =
6
G > 8 1 M?7
?= > 1
g ::
> >=
<:
?= ;
2= 5 8
?>= 2 5 8 5=
C7
H C 5
? 67
f7
5< H ?= ;
>
4
8
5
41
67
2C 8
=
>
7
<:
5
2= 5 8
61
5
>=
5
;
2 67
5
67
<
<F>
4? E7
?E
>
=
5=
E:7
E7
4>
H
?>=
T
57
6
>8
@
7
? X7
1
?1
F
sec/Gcomp
=5
<>
7
? 67
?@
F7
?
7
2>7
>5
5
28
5 9=
67
5 F @7
6= 27 9 @7 471
9= @ 2 @7 2 g >1
8
47 5 : 5= 9 @7 g
>2= 3? G 5 =
=; = 9;
23 : 47 > ?1
G= 19 41 B > @
: G
SG = 6 ? :7
8
5
7 ? 67 9 @7 5 6
B
g
61M G > 2 5 67
=
7
8
<
5= 5 6 61 ;
4
5
?47 67 5 :; ? E7
G
>
C7 >1 67 ?
>
5 47 j 7 8 5 8
67
2 57
G 5 47 71
2=
9
5
= 6=
?>= @ H 6 5
Y
67
57 < E T67
@ 5 >7 H 4
9 @7 g 5 67 G 5 T67
= ?
A
2> 8 241
@7 >
5= 2 8 9 g > 5
2= ? 8 ?1> F 57
7 C7 7 8
?>= 27 @8 5 > 5=
F
57 5 2 67 ?1
@ = ?>=
5
;
9 @7 g 5 57 2= 5 88
68
H > @
47
Table 7:
27
67
8
5 ?91 < k
67
G5 @ 5
= 2= 5 68
F 5= F 5= 2> 8
>
?91 Y1 _ =
5
> @ 2> := ? 61
?= [
C SG @
5 1 7
67 > F
2> 8 ? 5 67 <
C? :7 ?71 55
7 7 G 67
5
421 > 5 =
2 88 9 ::8 @7
?1 9 g
C
F 5= > @ 2>
28 8
?91 2= ?2= ;
@_ 7 5
?= =
>8
51 g E= < ;
27 5 > [
= = 6 E=
5
21 t 5 ; 2 6
67 G=
F@
< 9 @7 g 61
<F 5 B > M7
> 8 5 67 ? 5 67
@7 > 8
G @= 41 >
2 ? ::7 41
2= = ::7
; >5
Merge-sort.
5
9 @7 g
5
61
25
G7
21
`
B B
B
]
B ^
B
B
n
Gcomp
Time (min)
sec/Gcomp
4
3
2
1
5
merge_sort ( first , middle ); // sort first half
merge_sort ( middle , last );
// sort second half
merge ( first , middle , last ); // merge both halfs
}
n/2
x
merge
// 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
]`
]
d
e
d
cb
a
T (n)
n
:1
?= 5 ;
F
<?
=
H ^
n
minimum_sort
2=> 8
B >_
19
?9=
2 @8 B
C
5=
T
?= 67
7
4
H ]
?1
F4
106
Time
9=
5=
8
:=
C
:=
_
[
_
J p[
?7
9
>7 ` 8
C
:=
<9 @
M7 5 8
3F 6
=
5
67
>8
>_
2 8[
C
H o
__
2= 5 8
<1
p
[
H _
T
6
>8
B
8 H
2 :; [
=
57
5
61
5
7> 5
n/2 , n/2
4? E7
<
2 67
5
? 5 67
67
Gg
9 67
9
>5
247
JF7
?7
n
]
[
47
>=
58
6
:=
?= ;
:
>@
6=
@ M
5= 1
? @7 <7 :
M 7 8 2> 8
77
27
4
2
>
2>= 8
?1
C
H
B
B
G
21
T (n)
[
5 3E B
67 29=
:1
? 557 ?<> 5
2 9
< 2= 5 8
B
4
5 ? E7 = ;
67
19 >1 8
<1 5 5
2 : 4=
< >5
21
4? E7
@
:7
?>1
68 7
?47
G
@ 2= 5
<
4? E7
2 @7 A ?<2 @
8
8
2= 5 8 C 5
= 67
; ?47
1 _ C7
5 >
4= F 57
>5 H
T
67
?= ;
T ( n/2 )
merge
C=
B u^ F<
B
B ^ ? 5=
=
<
B ou C
6
` :
B ] 3
2
1T
7
` E:7 291
F4
=
:7
< 5 := B
>1
C
<>> B
47 =>
5 5
61 67
5 >
5 51
67 57
> 51 247
57 5
247 6=
:
=5 >@
?
=
; ;
5
67
5
?= 67 H
7
5 8 G=
6
4 G
?> 8 7
7 291
<?9 F B
?
M>7 8 =
M7
58 5
2> 8 1 67
1 9
<? 5 <1 5
1 :
: >
5 51 57
61
5 247
5
F 67 = 5
?
== 5 ;
; 67
>2 8 5 67
8 ?=
<9 @ 7
4
M7 5 8 H \ H
28
9
?= I 7
5
67
#
/
G "
7 M7 61 D 1
:
E
9= ; 3=
?
<
F4 F
?1 ?
7
2>= 8 M= 8
<
> >
9
> 8 2=
E= >
<2 ? 8
@7
@7 1
5
@ 2= 8
3 E ?>
5 7
67 C?1
<> 2
@
4= 8
C
1;
::
? 56 H
77 P
2 5
< = :;
G :=
?4 E7 >
> 5 61
5
=
T ( n/2 )
S
sec/Gcomp
C19
C
:=
B
2
2
07
C
5[
6
>8
>8
5
2 67 8
<9 @
M7 5 8
3F 6
=
5
67
>8
>_
?
=I
4
5
6
>8
F3 6
=
5
67
>8
G>
?= I
?C=
T
8 B
G4
H
C
:=
> :8
= ; @8
G ::= 3= 5
H > 5;
67
> 51
57
247
5
?= ;
5
2 67
<
4? E7
67
4<
8
=T
42
M7 5 8 < >77
2
< 4? E7 B 5 6
8
4? E7 = > :7
; 5
<
2> 8
>9
?>= 9 2=
=
2 58
F ?> 8
C 4?1 @7
5
1
67 2>= 8
>7
:7
521 ; H > 2<7
9
@ T 7
5 2> 68 =
;
? 67
< 7
C 68 4 :7
5 ? E7 2
61 = 47
F :; 9 ; > 5
< : F= 5 61
> 4?1 1 5
5
2 67 8 <9 5
< 2>= 1
:
4? E7 > 8 3? :
> 7
= 5 <?
9= ; 67 7 8
F4 <> > 5
?1 4= 67
2>= 8 5 ; J41
D
> 67
79
F7>
?
2>= 8
>
D C7
?>=
?47
5
# #'
# (
H u H oo
o
] H o]
]u H H `ou H ] H o
^^ H H u `
B B
B
]
B ^
B
B
n
Mcomp
Time (sec)
sec/Gcomp
2 58
<7
>
:
7 g8
5
6
2> 8
;
merge_sort
Mcomp
Mcomp= 10−6 (n−1)
=
n
n
T(
) + T(
)+n−1
2
2
n
n
n
n
(
− 1)
+(
− 1)
+n−1
2
2
2
2
2
2
n
n
(
− 1)(
− 1)(
2 n − 1) + (
2 n − 1) + n − 1
2
2
n
= (n − 2)(
n = 2 + n2
2 n − 1) + n − 1
(n − 1)(
2 n − 1) + n − 1
= (n − 1)
2n .
N
M1
5
T (1) = 0 = (1 − 1)
n
2
{1, . . . , n − 1}
? ::7
41
:=
N
>1
C=7
5
5
9= ;
?1
F4
=
4? E7
<
2 67
<2
:8
:
=9
#" B G
G7
#
#
>
?= ;
m
Table 8:
29=
1
B :7
<5
>
29=
9
<:
G @7
merge_sort
4? E7
n
" N
n
#
N
T (n)
<
2
?= ;
>
m
2> 8
5=
n−1
5
9= ;
=
@
9 @7 g
57
GC 5
=
?>=
n
2 67
19
#
&
#
2C 8
n
97 5 8 F4
H ?1
T 2>= 8
? 67
7 >
<> G E7
5: 5
2 8 2> 8 277
<?9 1 T >7
> E:7 2<7
`
<49
97
6 = := 7
:7 g :7
>> M 2
9= ?7 47
F4 3 > 5
?1 @8 2> 8
?7 t 8
2>= 8 27 @7
7
> ?5 @
5 =; 1
2 61
4 C==
5
67 @
2= 2 8
7 9 @8
2> 8 1
? 5=
1 T ?= ;
=
<? E:7 5
<2 H ? 67
<2
58
58
? 67
427
7
8
>8
?
F
?47
::8
=
m
; C1 G 5 E7
9
79 = 2 8 7
B
5 F4 G 27
3 = ?1 7
< 8 9 >7
5= 2>= 21 2<7
<2 H > ?1 9
7
? @7 ?= I C<7 7
:7
2> 51 5 61 247
#
@ / 55 5
2 5 8 " 67 > 5
G= B 5= 61
51 = 5
5 2 : 99
< k > 68 < <?
G
5
?= ; 19 ; 4? E7
5 = 2 67
5 2> 8
67
F= ; 1
=
2 E7 5 ?7 >7
7 >= 1 <27
2= 5 8 9
A
=5 4 8
7
2 ; [ 47 F>> 8 =
= 1 @8 ? ;
F= 2
2= 5 B 57
?= <
3 : _ 5 6= 2= 5 8 4? E7
5 < 1 >
67 B C :
6
8
>F97 21 5= >
5 2 E7 8
5 G@ 6
?9 8 7 2> 8 C
< ?>=
71
2
? @7 @= 4? E7 57
H @
5V
JF7
delete [] deck ;
>
B
<U
>5 2 \
8
97
::
G
m G7
?; 5 9
7 67 9 67
<?9 9= g
F
2=> 8 4 5
B ?1 > 68
8 1;
>= 2>= 9
5
:7 > JF7
5< 51 g ?7
F7 8
?> A
:1 247
> 5 97
51 H
9=
<2 <?2 @ 3 ::
5 8 E7
5 C G :=
2 67 5 67 B
< 91 G1>
4? E7 > :: 7
5=
= 5 @@8
;9 67 ?= ;
=
F4 <2 ;
?1 9 # 2= 5 8 2>= 8
#
>
#" G 5 E7
1 277 5 H 5
>7 M 67
?
1
<27
=8
97 <
B
>
=
>:
M7 :7
}
@
>79
2>= 8
>
G 5 E7
277
G5 7
= :7
2C 8 5P ?=> 247
8
FC F>1 57 > 5
? F
=9 ?1 @ 5 61
7 27 9 @7 g 2= 5
>>
1 ? 5 H > 79
1
=;
M7 E=
::
4
5=
_ 5
67
5
61 <2 ;
5 9
F
2= 5 8
?7
#
?= ;
E=
@
24> 8
3
?=
9= 21 [
F4 1 @
? @7
?1 >= :
5=
?
?9
2>= 8 = ;
71
57
2> 8 4?=
1
77 <2
?>=
@7 ?= 8;
57
@
@
?= ; 41
9 @7 g
M?77 :@7
=
?>9
;
39 F 8
?1 5
91
?
2= 8
@
5 =
?> @
61 ;
=;
5 5
> 8 67
4
?47
merge
2 @A
n
5 2P
2= > 68 =
5 ? 5 67
7Z
? A > @ 47 8 G
> 5 F 5 67 2 8 ?=
= ?
>7 B @
?>7 E ?= 29= >
M 7 C1
@
5 24 2>1
61 7
5 7 2@
5 @ =
6 >
> 8 F 5= 5
:1
2
? 557 ?7 4< 8
2 ?= ;
57
<
:=
4= H > C
2
4? E7
7 <k
15 H
C19 8 2> 8
=
F 1 T > 8
G 4?1 E:7 5 67
1
5 8 2>= 8 B E
6
>=
<:
G H
? 57
? 67
<2
7
5
5
57 47 8
? 67
:
: =
1
<> ;
57
> F 5 67
=
G 6= ?
;
?9 @7
?=
71
241 C1
B
>7
3 4
2
47
@ >
5 >
61 41
5 ? ::7
21
9= E7
0
21
T (0) = T (1) = 0
T (2) = 1
?1
9= ;
E
8
1
F4
=
4? E7
<
>>
=
2 :7
F#
#
$ #
n
H _
67
merge_sort
S
3
E7
+
#
5
@
?1
F4
F
5 G 5 21 <
672 =
@ 5
G7 @7 5 2=
9 g ? 67
5
>
9 @7 g E7 C 8 2 67
9 5 6 G7
G _ = @7
4
7 7 9 g @7
> 2 9
2 @= F7 8 H g
4
?= 2
P
5V 5
3
@= [ ? @7 @7
21 5 6 5= B 7
8
G@
3 >> 8 2 A 7
<? ; < 5
1 =@
? 5 67 2= 5 8 < 41
5G 3
9=
61
F4 2 @7 A 9 68 M7
?1 8 9 6 5=
57 ?1 9
2>= 8 3 :
=
=9 @ F
> 9 5= 4?1
<?
T > 51 g 7
68
> E7 7= 5 67
4271 ?=7 ; 2 t G 5
J7 =
> 5 67
5 F 5=
5
H
61 :1
5 > 5 < k ?91
9
?1 5 8 @
; >
# @ 2= =
F> 8 7 ;
5
< = 67
;
2= 5 5 :7
67 5 ;
merge
o[
67
=;
G := :
28
C?
7
?<?9
27
9
?7
7
:1
2= 5 8
5
n
5=
2
M7 61
7
C
:=
57
?>=
9=
2>= 8
9 @7 > B
G g G 5 E7
7
5 8 27
6
>7
?91 <2
7
@
H > 97
7
:7
247
5
?1>
7F
421
?8
?7
7
?= ;
<>
5H :
47
2 @8 H
G=
28
C
5
B > 68
G
7
291
2
G=
F
?
M=7
=
<?
2
7
2=
Analyzing merge-sort.
G
2
n
n
T(
) + T(
) + n − 1.
2
2
B
&
T (n)
7
A
#'
(
2 @7
7Z
Proof.
=
7>
F4 2 :7 ; <
2
7
?1
9
82>= C 5 6 7
7
:7
?>1 H 247
7 ?= I
5
41 J 7 > 5
@7 1 61
H F4 9 5
7 Z B :7 21
1
=9
>= :
<?9
C7
5
?< @
28
C1
B B 91
2> 8 2 ::
97 >9 8 5=
7
?= ; ?=
;
1? ?
2
1
21
C7 C7> G
= =
8
2 :7 ; 2 :7 ; 5 6
21
C 5 C ?1
5
B 6 >6 C
<
# 21 247
/
@ ?5
" B 2 21
= C7
9=
(n − 1)
F
9 @7 g ?7
?=
= ;
;G 4
5 >
= 2=
9?1 79
=
> @ _ F4
?1
2P
8
1 2>=
2
> 8 8[
48
? :1 ?47
G
1 C2 8
G3 GC
7 =5
291 ?>=
29= 57
M2 @@7
8
97 9 g
= =>
<? 2= ;
>7
M7 : 79
?1
>
5 7@
61 1
5 9
2 68
5=
2=
7
T? ?>=
67 57
7 @
T (3) = 2
5 9
7
9 @7 g >
G =
2 :7 ;
H
9 68
C
92= 6 5 6
> 8 ?= ;
>5 G
2=>
6
: 98
3 = 2= 6 B
2= ; 7
7 9=
?91 F4
?1
B @_
2>= 8
<E
5 <>
5
67 9
7
J41 >
[
8 5
4< ? 67
24 > A
< ?91 5
4? E7
@
5 41
61 3
5 E7 H
2 @7 A 51 g
7 27
>
5 7>
67
:7 <27
;
t Theorem 2
N
>8
T (3)
2C7 H
?7
1
:
?= I
=
int * d = deck ;
while ( first != middle ) * first ++ = * d ++;
while ( middle != last ) * middle ++ = * d ++;
T (n)
n
merge_sort
n−1
n=1
n = 1
1
sec/Gcomp
n = 51, 200, 000
]
]
d
e
d
cb
a
5 21
2
? 8
7M 2 A
=8 8
< 57
G> >7
?= <27
@ 97
=
B G;
G
?=
7
> @
F4 8 >
3:
<>
> 5E
< 58
57
1 1
:: >
>3 = :;
G :=
4 E=
>
H
2> :8 = T
C7
5
5
E3 2 67
5 J7
? 67 8 5G
F
? ?=
=
<9 @ @
2= 5 8 ?= ;
H> 4
F 67
wi−1
K
s
Σ
>
s = w 0 , w1 , . . .
wi−1
wi
57
s=F
σ1
1
wσi = wσi−1
σk
k
wσi−1
.
(i − 1)
OO
σ1
wσi
σk
wi−1
P(σ) = σ1
57
5
G 67
?=
?@
7
<>
2 5 :8
C
=
wσi
;
H =5
?
67
2 T67
G >
3
7 4
291 B E= :
>
:7
2 @7
5
Σ
O
K
σ
B
w2 = wF2 = F + F + +F + F + +
3?7
41
8
5
2= 8
5
2=
1
? :1
FC7
79 8
7
=
4F7
>=
C1
2C 8
7
1
<? 5
5 :7
>8
2 55 8
41
P
H _
T
67
<? 5
5 :7
291
<2
? @7 FF1 ;
2> 51 B ?7
G
@
5 58
67 6
I8
<?C
7
:7 [
5;
>77
? @8
79
2= 5 8
47
>=
2C 8
2 58
F@
2=
8
1
E=
5=
5
T
67
68
8
G
7
1
5
6
>8
37 8
:
>@
B :7
F4
J7
<?
2P
=
C
41
>
>8
5 2=
61 :
?1 5 3?= ;
F7 M
?7 ?7
?= ; 3
? :1
47 C7
@
H
58 P
;
47 3 =
> <
>1 5
3 2 68
17 1 g
F< 5 E=
<
1 5
B 58
4<9 5
6 > 68
6 2> 8
C? 8 =
67
? ?> 5
19 ; <F
?
2= 5 8 2> 8
8
= C
; H
5 Q
67 67
5= F1
51 F=
? : ?7
<2 1
5 8 2= 5 8
47 >
68
<2
61
58
5
5
5
9= ;
2>= 8
>
?1
F4
=
4? E7
<
F> 8
?
F=
?=
2= 5 8
1
:
5=
5
2 67
47
? 67
57
91 @8
5=
28
4>
>77
>
T
]
]
]
d
cb
a
d
n
e
:=
2 67
2= H ::
5 T6
2 67 > 8
8
< >
E79 B
4? E7 1
<
= >7 B
;9
=
F4 ?> 8
?1 7 :1
2>= 8 M7 5 8
> 3:
G 5 E7 ? :1
7
277 C9
=
>7 F4
?1
2<7 7
97 @
7 5=
:7 5
67
247 <F
F
5> ?7
H
< k E=
5 <2
2> 8
97 = @
;
p
#
#
/
'
(
G
n
F + F+
−
C
MC7 8
>
5
F 67
98
<? 5
7
G>
G7
?7
7
51
2 :g
>
5
@
B >@
21
G>7
?=
5
i
?h
G1 @
>8
F> 57
H 5 2 67
J7
<
>
41
p
V
=>
?= I
F
90
> 5E O
< 5 8 OO
2= 5 8
D [
5= 1 = :;
:: @
5 <>
67 E
>3 > 5 8
5
4 E= < 5
2= 8
:
H> B _
T 21
6
> 8 2 @8
>
G 6=
5
> 67
<>
σ
3E
H
−
=;
:
@
B
1 67
>5
7
C:
2
n
D
5
2>= 8 61
9= 291 5
47 G
2> 8 7
JF7
F 5= ?
:1 7>
3 >
\
<FF 2
8
= ?
57
>7
5 4
61 >
5 =;
5
67
1
9 9=
9 :=
G
77 g 4
> 8 241
H i >7 @
>
T 3E B
67 21
B
<? 5 21 21
5 :7 C
:7 @
291 =
F ; H
?
=9
7 ? @7 4271
> C
2>1 77 >
B>
3 21 i 4= h
>7
M
<27 @ 27=
7
97
= 4271 F> 57
;
<>9 > ?= ;
5h G
9= 6 <?2 ?1
4 9 := B @i
241 G9 g
B >@ 8
>7 4271
3J7 E 3 E >
7 21 <? 5 h
<9 21 2
2 58
C 9=
C = :7 <2
5 ;
67
D ? 57
4
?C @7
F +
7Z
?A
>5
<>
> 5E
< 58
57
7
?<9
B :7 D
G =;
7 :@
<>
M7 61 E
>5
?= ; < 5 8
J 7 2= 5 8
1
F4 =
;
:7 1 :
:
>
3
4 E=
>1 :
9
?9=
2 @8
C
5=
5
? 67 8
F
?
=
21 < @
9
@ 2= 5 8
H 2>
P
=
?= ; <?
7
2=
79 8 7
Turtle graphics.
>
67
Recursively drawing Lindenmayer systems.
σ
i
3E
5
F
=
F ; ? 57 ;
F1 21
I8 ?
<?C 7 = 5
7 H ? 67
T H
? [ F 67
1 7Z
C 8 5 ?1
B 5 6 _ 6 27
1 2C7 8
2 := ?71 ? 57
7
GC 57 >
57
@
5 8 E 2 @8
6 3
5 5
F 67 9 67 ? 5 67
= = 7
> 8 4 <>
2= 5 8 241 2 5 :
8
21 @ CF
>7 1
?= @ <2 5
27 8 79 51 6
51 7 27 g
2= 5 8
E
= B 3
5
;
5 ?= ; 67
67
<? 5
<? 5 J71 5
5 :7 F4 2= :7
1 B :7
? 57 ; 8 5 67
>
>
G 6=
2
28
@
=
=
=
=
..
.
O H
G
7
F1
F
3:
wσi
2> 8
G=
1
=9
50
F4
?
F
merge_sort
= ; ? 67
G := : ?7
5
JC7
57
Σ
T 7
4 67 2>>
M?=7 <? 5 8
C
5 5
5 9 :7 67
67 21 9
=
F1 :
5 4
?
61 67 241
E7 7
5 ?=7 ; >7 @
?C <
F1 27
9
H 91 68 H 7
:
32 :
8
?F 57
?
7
21 5
3G
?=
@
2C7
?7
1
57
@
31 E
2 f8
2 @7
3>>
Σ
28 4
=;
n(n − 1)/2
w0
w1
w2
w3
>
?
u
@
H>
T
6
>8
>8
421
8
3:
<7 @
5=
5
67
>79
2=
<2
28
?1
=
>1
47
1, 600, 000
8
T H
?
:: 2<2
67
merge_sort
1
5
@
1
Σ
6 67
>8 F
G > 8 2=
21
3.2.7 Lindenmayer systems
Figure 19:
OO
51 E
5
n
28
=
D4
minimum-sort
?
5 7
61 <>
5 2:
58
GC
?=
@
>
9=
>>
>
7 @=
minimum-sort
1
:7
>8
5
61
5
H
5=
n
?= I 8 :: 2C 8
T
C8
?=
5 8 67
6
E H
# 21 :7 2 7
4 4=
5
F> 5
: 67
Z = ?1 # G @ 31 9
68 > :
:7 8 17 #" 7 > F1 67
>
M 58
5 8 27 3 @ B ? 51 9 E7 F=
51 g G7 ?= ; 5 = ?7
1
5 5=
7
> >= > F> 68 >77 47> 2= 5 8
M
?7
; 41
1 T :: 2 67 F 5 67 3 2> 8
H = ? ? :1 =
` E:7
247 7 WBC7 <?
9=
2= 9 @8
8>
57 5 67 F
5
F@ ? 4
61
7 @= ? 1 ?1
?4= 5
2
> F= = 5 8 2>= 8
7
= ?=
5
5
G E7 9
2 61
> 2= 5 8 7 5 <2=
G 6= 1 27 B
G5
5
=
2> 8 5 :8
5
8>
3
97 H 21 > 68
6=? 19
9
<
@ <2=
5
> <1
8
2
:
>
5
F 5= 3 :
7
? F1
>8
5=
C
=9 ?
:
:= =
C 88
7 19
F=
C
E:7
>> 5
91 8
58
9=
:
4
F4
?>=
9= E7 > 5 8
98
?1
2 58
7
47 ?= ;
>
C
@
?C= :
1
2
?7
2C7
3
1
B>
4? E7
<
2
(n − 1)
4
57
P
B
T
97 8
F 5=
?
F 67
n = 1, 600, 000
<E B
5
5
67
19 ;
5
5
61
5
58
B G ? :1
5 8 ?C7
6 9
?> 5 8 21
79
<? E7 H
J7
M>7 8 F
?> 5 2 :1 8
D <9 7
H @
B C7
>
? :1
>8
5
68
9=
n
3>
>
P:Σ→Σ
H# H
\
<9
16
H
67
19 ;
5
5
5
5
1;
F 9
2 8 2 4?1 55
5 2>= 8 5 61
67
= 2
5? >
67 77
2 61 @7
@ :=
B
Y 5@ 3 E C
?= ; 67
58
>1 8
247
77
4<9
@7
6
@ [ >
E3 5 61 41
G
? ::7
G> 5 V 2
7
=
<
3G 6 4
?>7 E
M7
7 ? E7
F G
1 ?7 > 5
2
19 ;
59 8 61
? 5= 9= 67
= F4 ?= @;
?1 ; 8
= > 4
<2 ?1 @ 9 B
=
@ 41 F4 5
91 5 8 5= 2 67
<
5P ::
3 09
41 68 = 4? E7
3 C? 67 F4 =
E7
H _ ;
2 61
merge_sort
(n − 1)
2n
minimum_sort
61
? 5=
C
2> 88
?
<?F>
n
O
::7
1@
merge_sort
67
J7
?5
1 1> 8
47 ?4=
?4= 7
9
32 F=
77 4 :
@7 91 8
@
?= ; 57 @
1
5 :
2 67 ?C=
G7 5 8
6
4
@79 5
B g 2 61
7
59
5
<? 5
B7
n(n − 1)/2
B
?= ;
J7
# 1
! F
4 :7
!
= (Σ, P, s)
Σ
F + F+
&
7Z
48
C
56
?= ;
J7
1
F4
:7 H
M7 61
5
F 67
?
=
<9 @
2= 5 8
F
5 ?1
68
> 2>= 8
>1 8
>9
4= 21
? @7
1 E7
F 57 2 @=
? 7
F
B 97 8 ?7
2> 8
9 9>7
G 7 2=
7 B @
291 2> 8
97
?4= 1
7 :=
5 5
2 61 = ;
F 58
1 47
3 28
?= ; >
77
5 8 @7
E3
@
5 ?= ;
67
=
C21 5
8 ? 67
28
F=
5= ?7
51 1
? : 2= 5 8
<2
58 H >
47 < k
H
5
minimum-sort
91
H
Σ = {F, +, −}
m 2 2
21 8 P
5
5 6
2 E= 21 2> 8
A
B <> @ 1
@8 :
5 9 >79
68 <
F1> 5 : 2= 5 8
F
5= G
91 :8 M1 G7
= 21
2= 5 8 @8
5
> 21 [ F 5=
:7
?
5 ?8
<> 1 57 27>7
?> M 5 8
G 1 @ 7 21 5
M?7 =
E71 > ? 5 67
< G2= 8 F1
F
5
< 8; =
F : < 9 :8
1
9 8 2 :@ 5
<? 5 8 2= 8
7 7 @7 2 8
H > ?@ G
7 6
<? ?9 8
78 76
21 <?9
JF7 2>= 8
9 :8 F> 8
58 ?
> 51 7
9 g @=
D
H _ 4
>1
n
→ P(σ)
→ F + F+
→
+
→
−
?= I
f7
J7 J71
<5
G 5 F4
?>
7 B :7
H >A
JA
5
f7 J
1
5 21 A
<2 ;
9 K
2 @7 2= 5 8
'
H = 57 5 (
67
>7 G
= 5 9 68
1; 6
:: 8
>
F41
& > 8
F
>
4:
M?77
5 31
61
3
G5 2A
>
7 57 8
3
4 E=
291 >7
:
5
?= ; =
5=
;
1G
4? 3>
?=
=; 4
E=
@
4
B >:
21
3 > ?= ;
@
4 E=
J7
5
67
2> :8 1
>7
F4
?1
7
:7
H
2
>8
σ
F
+
−
B
'
67
n
(n − 1)
OO
T 2 I8
67
?5 1:
F 8 B G3 :
:7 7
JA
21
5
n
n
F,
F+F+
F + F + +F + F + +
F + F + +F + F + + + F + F + +F + F + + +
p
+
90
F + F+
{F, +, −}
w+
i = +
i
σk
// draw w_n = w_n ( F)
f(n );
}
return 0;
w_ {i -1}^ F
+
w_ {i -1}^ F
+
int main () {
std :: cout < < " Number of iterations =? ";
unsigned int n;
std :: cin > > n;
<
F
;
n=5
w∞
90
8
>7 5
:
H ;
4<9
C7
Y6
5? 8
=
51
57
B
47 >
2
1
3<=
9= @
< >=
: 47
@
H ]
G_
=
<
:
@
MC7 8 > 8
5
67
>1
47
H m
<>>
o[
2 T67
7
<1
2= 5 8
n
;
G 5;
?=
=
51
57
? @@
G1
28
C>
=
=
>8
>5
>
29=
H
@
[
H o]
_
21
21
@
@ 28
51 88
G:
@
C7 ?=
5 @
H \
28
97
21
?= ;
1
B ::
G
7
@=
B
<
F
5
28
?= I
1
5
F ::8
?
=
<9 @
7
5
67
=;
G ::=
28
C?
G1 @
28
HC
G4
?C=
?
F 67
$
!
#
/
'
Program 27:
H
! 5
67
?@
G1
28
C=
S
#
n=∞
5
28
>
51
8 C7
>: >5
@7M ? :1
7
F := ?
B B C7
< E 5 67
F1 5 F
?1 9 8
<? 5
?5 7
=;
@=
4 7
5 2>
61 =
5 5
5
67 >77
F4 8 4
?
7 5=
> 9
2>= 8 2 61
@7
241
4
wi
H
Additional features.
α
61
5 7Z
41 291
3
E7 J7
@ 2 57
?7 8t @
27 5
67
?5
= ; 2 @7
A
4 58
2= 8
?C @7 = ;
77 1
> 2 f8
T 2 @7
6
> 8 41
> 8 3?7
>
G 6= >
2 3
>
2 8 57
? v 4 5=
2
?C= 9 8
1 <:
4 ` @7
] 1
98
<? 5
7
?= ;
F 67
5
m
:
:8
GS ::
G7
7
@
> 5E
< 58
57
<>
5=
? 5
G1 @ 67
?v 2 ?
8 @
?C= C G1
1 >= 2 8
4 1 ; C>
] :: ?= ;
> B
G 6=
?= ;
>
G 6= ?
<2
5 22
6
G> 8 8 H
?= C? 5 = T
g =6
> < C7
?= ; C 5
5
= 6 67
?< 5 67 1
9
?
<22 3> <1 5
2 8 4 E= G :
?=
>:
JC7 = @
1 5; B
F4 67 G
28
7
G :7 8
1 5 8 F> 8
8 G: 4
F 5 6 ?= :
?
3
= @ 29=
<9 @ H 91
2 57
2= 5 8
1
>
57
5
67
n = 14
?= ;
7
w∞ = w∞ + w∞ + .
1 "
# include < iostream >
# include < IFM / turtle >
1g
>1 8
7
?
G1 @ ?4=
// Prog : lindenmayer.C
// Draw turtle graphics for the Lindenmayer system with
// production F - > F +F + and initial word F .
F →
7
>
68
1
>=
G>
8
2 @7 A
7
@
<? 5
5 :7
9=
F 56
?
7
wi = wFi = wFi−1 + wFi−1 + .
5
F
@=
3
8
1;
? :E8
?1
=
97
2> 57
5
=
25
77
2
−
M 61
is drawn
{
67
G
67
J7
>
47
<>>
turtle
4>7
M7 :
H>
5
forward left
i
7Z
79
F>
2 @8
21
41
C1
?=
?
F 67
T
P i (+) = +, P i (−) = −
51
>
?= ; 32 8;
8
3 > C1
4 E= 2 f
8
> : 2 @7 B
5
61
?1 5 34?17
27
= 3>
5 > 57
F41 B G4
F
7 7
@ 9
5= 21
:8 B
F> 5
?
=
<9 @
2= 5 8
3:
<2 ;
2 P ?>7 8 9
= 2= 5 8
5 51
67 5 >
2= 8
@=
<9 G >
247 5 8 B
6
51 >=
52= 8
47
= 21 9= [
<2
;
5 C :7 _ ? 57
67F 2
? 2 8 9 :=
?C= 1 G9 g
1 F47
> >7 8
G4 19 ?=
7 7 51
5
M7 61 H G2= 8
=
58
48
6
557
>=
@
47
21
5
67
C :7
? 5h
21 _
M8
18
@
F :i
?
=
<9 @
9[
:=
2= 5 8
D9g
>
G
F
? 5 2= 5 8
G1 @
21
>1
2> C :7
=
G
// POST : the word w_i ^F
void f ( unsigned int i )
if ( i == 0)
ifm :: forward (); //
else {
f(i -1);
//
ifm :: left (90);
//
f(i -1);
//
ifm :: left (90);
//
}
}
61
:
+ → +, − → −
32= :
<>1
<
F + F+, + → +, − → −
+
:1
=> :
1
;
F4 8
7 :8
>
5
61
5
5
67
?@
G1
28
C=
4<
68
>
?= ;
T
28
7
@
3E
>
F4 8
39 :
2=
91
2 57
1
2 58
C
8
=>
E51
wσi
?
5 =
T
1
k
wσi−1
, . . . , wσi−1
wσi
σ
s
ifm
right
^
]
o
]
d
e
d
cb
a
&
$ q
/
'
>
3> B
57
G4
58 B
6
41
3?7
2 @7
67
2 f8
H>
?= I
J7
> 1
F4
B :7
5
=
<9 @
2= 5 8
?
8
1 58
G:
?=
@
21
F@
?
=
<9 @
2= 5 8
28
B
F
3
<
>7
2 @8
G> :
4 E=
E7
3
>
41
3
E8
:
58 B 58
6= G3
<
21 5 79
21
3?
CF1 1
>= :
91 68 J7
2 :8 2 57
?F 57 5 @
? 67
7 F1
51 :
2= 5 8 61
Y 5 E7
5
67
>7 =
?1 > ;
7 3
> 5 4 E=
:8
<: H >:
>7
< ; ?= I
: J7
5 1
6=
< F4
C B :7
6
8
J7
7
@ ?4=
5
31
@
C7
=T
41
7
G
2> 8
97
5
67
Σ
X
d
e
77
>
H _
d
cb
a
return 0;
}
X → X + YF +
Y → −FX − Y
>
G 6=
2
28
?v
?C=
1
4
]
@7
>8
=
C9
H
// draw w_n = w_n ^ F ++ w_n ^F ++ w_n ^F
f(n );
// w_n ^ F
ifm :: left (120);
// ++
f(n );
// w_n ^ F
ifm :: left (120);
// ++
f(n );
// w_n ^ F
Program 28:
2=
F7>
67
?
?9=
T
w_ {i -1}^ F
w_ {i -1}^ F
++
w_ {i -1}^ F
w_ {i -1}^ F
2 @8
F
int main () {
std :: cout < < " Number of iterations =? ";
unsigned int n;
std :: cin > > n;
Σ = {F, +, −, X, Y}
?C @7
is drawn
{
// POST : the word w_i ^F
void f ( unsigned int i )
if ( i == 0)
ifm :: forward (); //
else {
f(i -1);
//
ifm :: right (60); //
f(i -1);
//
ifm :: left (120); //
f(i -1);
//
ifm :: right (60); //
f(i -1);
//
}
}
90
;
=
C :7
21
w14
B
37 8
:
>@
5
67
/
[
]
u
]
// Prog : snowflake.C
// Draw turtle graphics for the Lindenmayer system with
// production F - > F -F ++F -F , initial word F ++ F ++ F and
// rotation angle 60 degrees .
# include < iostream >
# include < IFM / turtle >
// Prog : dragon .C
// Draw turtle graphics for the Lindenmayer system with
// productions X - > X+ YF + , Y - > - FX -Y , initial word X
// and rotation angle 90 degrees
# include < iostream >
# include < IFM / turtle >
void y ( unsigned int i );
// necessary: x and y call each other
// POST : w_i ^ X is drawn
void x ( unsigned int i ) {
if ( i > 0) {
x(i -1);
// w_ {i -1}^ X
ifm :: left (90);
// +
y(i -1);
// w_ {i -1}^ Y
ifm :: forward ();
// F
ifm :: left (90);
// +
}
}
// POST : w_i ^ Y is drawn
void y ( unsigned int i ) {
if ( i > 0) {
ifm :: right (90);
// ifm :: forward ();
// F
x(i -1);
// w_ {i -1}^ X
ifm :: right (90);
// y(i -1);
// w_ {i -1}^ Y
}
67
5
8
D A8
2 @7
Y
2< ;
9
2= 5 8
91
:
>:
<?
M>7 8
<2 ;
9
2= 5 8
Y>
M>7 8
MC27 8
?
7
<?9
1
_
HH
H
Y
Exercise 83
unsigned int f ( unsigned int n)
{
if ( n == 0) return 1;
return f( f(n -1));
}
/
&
!
3
67
=
2 @=
5
5
5
5
HH
H
9
_
57
?
@7
> 58
8
:=
C8
> 5m
>8
6
= E8
1@
? 57 ;
5
67
21
47
1
27
?1
4>
3>>
41
3?7
3.2.8 Details
' 61
7
G1
?1
@
::
36
58
41 g
7
>
2>7
>7
5=
2 @7 A
7
1
<2 ;
9
2= 5 8
G@
21
2 @7
E_
@
7
?1
[
E7
2>1
B
2>= 8
?;
7
<?9
=5
2 f8
67
21
7
51
Q=
@
>:
3>
4 E=
3< :
>7
24=
4
2= 5 8
?
91 68
2 :8
?F 57
58
?6
CF1
2 I8
1
:
32= :
7
291
1
@
@
3>
4 E=
G> :
$
/
/
'
1
_
[
_
/
&
'
' $ "
H>
51
>g
MC27 8
[
G _
?
8
? 57
79
?<
M>7 8
2< ;
9
2= 5 8
>
?= ;
4? E7
<
[
5
5
9= _
2 67
<2
B ::
<
2> 8
C
91
3F 5
27 8
?1
7
<?9
M>7 8
<2 ;
9
2= 5 8
8 =;
F=
5= ?7
=
Y: 1
2= 5 8
>=
1;
MC27 8
<9 @
2= 5 8
1
>
5
67
421
28
Y
97
241
@
F4 8
?
M=7
5
? 67 8
F
?7
?= ;
2>1
<2 ;
9
2= 5 8
M>7 8
C
j7 8
28
7
9
27 8
?5
7
<?9
[
? u_
79
2=
Exercise 82
91
M>7 8
<2 ;
9
2= 5 8
?;
7
<?9
>=
B 58
3<=
>
6=
<
:
@
F> 68
2=
5
5
m
5
58
6
[
< U[ < U
F
F
>1 4 4 B
427 E1 2=
8 9 7
?F 57 g F> 57
? 5=
7 :1 ?= ;
51 ?> G
5
2= 5 8 7 ?1
B
1 47 @
B > 4 5 68
? E7 >
>1 7 @=
3H F @ 27
= >V
>8 5
2= 5 8 M1 :7
7
H _ 1
P5 ? 5
1
>1 8 97
B _
>= :
?
F3 5 7 [
H
91 8 47
: 4
5= ? E7
1 9
<?
2 @@ ?2
G7 7
F5
> =
3 >8
4 E= 2= 5 8
>: _
G
return 0;
@
9 58
241
>7
5
C
? @7
6 2> 51
8
>7 5 @
:Y ;
5
67
29=
F97
<
F
2 f8 2 f8
91 :8 2 @7 2 @7
2= 5 8 41 41
? ?
2> 8 3 7 3 7
9= 3> [
>
F4 57 ]u
< 4> `
? 57 G [
?C 5 8 G u _
F1 6
2C7 F 6=
9 68 ?7 ?
H > 1 F=
j 1 :8 =
>7
2= 5 8 @
> 5 67
5=
D o 42 8
@8 247 `
2>= 8 5=
1 4=
F> : @7
19 :
7 5
_ 67
?
M7 61 GC=
= 5
<2 ; = 6
F
@ ;
241 2 :1
5
3 H>
F1
// draw w_n = w_n ^ X
x(n );
67
2> 51
? @7
<2
? 5 6 <2
=
_
int main () {
std :: cout < < " Number of iterations =? ";
unsigned int n;
std :: cin > > n;
( # q $ L '
$ $ (
! /
#
$ ' .
!
+
/ &
[
]_
H
4>
> 57
3>
41
3?7
?@
G1 @
28
C
2 f8
2 @7
2C1
2 58
?>=
28
2>= 8
?;
7
<?9
=
G=
?7
5
G1 :
1
3>
? 57
24 8
1
57
]_
f
]
<2 ;
9
2= 5 8
2= 5 8
2> 8
5=
RQ
R
@
25
7
>>
=
?;
79
79
??9=
21
2= 5 8
>
?= ;
57
18
79
F 67
?
F
F1
o_
Program 29:
2 @7 A
<2 ;
9
2= 5 8
5
19 8
:
41
@8
5
<9 8
?B :1
3<=
>
6=
<
:
@
E7
1
E:7
5=
?1
F
2P
Operational.
41
_
2A
F@
?
D7
21
F@
=
>
2= 59
[
Dispositional.
F> @8
?
M=7
? 57
24 8
1
2= 5 8
M=7
?=
?
F ]_
[
Lindenmayer systems.
M>7 8
2= 5 8 ? 5
21
Y> >
:1
? 57
7
<?9
o_
[
[
Y4
? 57 8
1
M7 5 8
?= ;
28
<2 ;
9
2= 5 8
M>7 8
? ^_
G7
?
57 8
1
MC27 8
?
7
<?9
}
3.2.10 Exercises
}
bool f ( int n)
{
if ( n == 0) return false ;
return ! f (n -1);
}
F
void g ( unsigned int n )
{
if ( n == 0) {
std :: cout < < " *";
return ;
}
g(n -1);
g(n -1);
}
3.2.9 Goals
unsigned int h ( unsigned int n , unsigned int b ) {
if ( n == 1) return 0;
return 1 + h ( n / b , b );
}
unsigned int
`]
]
d
e
d
cb
a
,
$
/
(
#
#
'
'
&
#
'
&
x
// PRE : [ first , last ) is a valid range , and the elements *p ,
//
p in [ first , last ) are in ascending order
// POST : return value is a pointer p in [ first , last ) such
//
that * p = x , or the pointer last , if no such pointer
100
n
_
[
'
q
q
!
#
'
$
#
$
(
/
'
#
*
'
/
#
/ ' ( # '
/ (
/ $ ' # (
'
#
/
'
(-
k
#'
+
k=1
d
d=2
( & &
! &/ ' $ !
* ! #
! [ ( ^_
[ &
u_ -
$
K
&
(
!
/ / / & q
#
(
!
+ #
&
'
$ '
% !
9
/
# )
$ - #
&
/
Exercise 88
Exercise 87
#
n!
n
:=
,
k!(n − k)!
k
# /
'
n<k
n k, k = 0
n k, k > 0
n<k
n=k
k=0 ,
n > k, k > 0
Exercise 86
1
1
,
$
# #
/
'
!
[
_
&
# ( #
!
&
& !
!
!
&
#'
#
/
'
!
9
unsigned int f ( unsigned int n , unsigned int m)
{
if ( n == 0) return 0;
return 1 + f (( n + m ) / 2 , 2 * m );
}
&
!
, n, k
&
_
[
#
/
#'
[
! ( '# u_
o_
[
$
$ L
*
# ! ( )
#'
(
& $ !
# +
#' -
Exercise 84
"
#
#
$ #
&
#
n
k
$ #
$
!
,
$
!
&!
#
n−1
k−1
#
!
#'
n−1
k−1
!
- &
&
! ( ' ! (
/ #
*
+
$
!
# .
/
(-
k

 0,
n
1,
:=
 n
k
&
k

 0,
n
1,
:=
 n−1
k
$
'
'
'
!
( , #
Exercise 85
(, q
q - _
(20), (10, 10), (10, 5, 5), (5, 5, 5, 5)
#
$ -
#
( !(
&
/
'
/
#
#
& / !
/ $
, '
'
(
)
/
#
&
-
,
/
!
&
(
&
#'
+
E_
// 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));
}
partition
// PRE : [ first , last ) is a valid nonempty range that describes
//
a sequence of denominations d_1 > d_2 > ... > d_n > 0
// POST : return value is the number of ways to partition amount
//
using denominations from d_1 , ... , d_n
unsigned int partitions ( unsigned int amount ,
unsigned int * first ,
unsigned int * last );
k
d
12 13 14 15 16 17 18 19 21 31 41 51 61 71 81 91
There were 16 possible codes .
unsigned int f ( unsigned int n)
{
if ( n <= 2) return 1;
return f (n -1) + 2 * f(n -3);
}
]]
]
d
e
d
cb
a
( !
/
' '
#
/
,
/
'
#
- $ #
#
,
q
! ( '/
# # !(
/ / #
/ '
# q # ! q
q ( ' / ' #
q
$
&
'
#
/
(
(
!
-
,
( /
'
G = T
?7
>
=
;
2 X1
=
8
& '
&
/ / )
$ '/
&
$ / q
q
/
q
fg8
_
7
B E_
<E
G5
58
6
5
F 67
?
=
<9 @
2= 5 8
>
9
7
21
5
(
?
2 @8
?F 57
2>1
77
?C @7
h ?= I
M4=7 5
2= ? 67
7 G1 @
F> 57 2 8
BC
G?= ; <
?1 ?>7
=
@
H i 51 5
2= 8
21
C :7
Y
>
1
@
X
'
'
3
3
#'
/
q
2
/
#
1, 2, 3
&
'
&
#'
+
/
'
#
n
+
q
/ #
1
! $
, #
- $ #
_ !
[
!
#
&
(
X → X + Y + +Y − X − −XX − Y +
Y → −X + YY + +Y + X − −X − Y.
'
+
'# ! ( &
# '
! ' $
#
! ( q
/ $ - [ _ #'
$
!
$ ( , % #
'
# ( '#
/
*
#
+ #
'
#
#
(
# α = 60
#
n=3
#
! (
' ' , ,
$ -
&
/
&
'
)
1
(
&
#
5
=I
?
<
'
!
! ! (
&
#' '
! !
' ! , /
'
/ # '
(
$ +
Figure 20:
!
/
2
79
2 Q=
m
#
/
'
/
'
*
#
' / / q
# #'
'
/
2
hanoi.C
n
.
(
$ #
/
#
(1, 2)(1, 3)(2, 3)
&
'
!
# (
(1, 2)
&
q - Exercise 92
n
#
!
#
Exercise 91
$&
/
) ' ! / ' #
$ !
/
&
'
/
[ &
_ /
(Σ, P, s)
3E
n − 1.
'
P
MC27 8
C
:=
_
[
2
(
* F → FF + F + F + F + F + F − F.
P
n
n
# &
Σ = {F, +, −} s = F + F + F + F
2
@
x
X → Y+X+Y
Y → X − Y − X.
T (n)
3E
21
'
:=
=
MC27 8
$
C
N
n
2
@
#
/
T (n)
/
Σ = {X, Y, +, −} s = Y
21
#
2
B
*
C
:=
n
2
'
!
!
#
Exercise 90
B
B
_
2
1
Exercise 89
E_
//
exists
int * binary_search ( int * first , int * last , int x)
{
int n = last - first ;
if ( n == 0) return last ;
// empty range
if ( n == 1)
if (* first == x)
return first ;
else
return last ;
// n >= 2
int * middle = first + n /2;
if (* middle > x ) {
// x can ’t be in [ middle , last )
int * p = binary_search ( first , middle , x );
if ( p == middle )
return last ; // x not found
else
return p ;
} else
// * middle <= x ; we may skip [ first , middle )
return binary_search ( middle , last , x );
}
3
(1, 3)
(2, 3)
2
n = 2
3.2.11 Challenges
]
]]
]]
d
e
d
cb
a
!
#
.
#
/
'
#
(
#
# &
$ & ' !
! ( / , .
# '
! q
'
# # ( /
( ' ! ' # #/
( !
' /
! ! / #
# ( /
'
q
& ' # $ (
' / .
& !
# /
#
'
' $ - ! '
( !
'
#
.
/ /
#
&
/
#
'
!
# (
' '
! (
#
$ ' ( ( #
$
&
!
'
#
!
! & & ' *
/ #
$ ' q
!
' &
# ! &
# '
/
#
! '
# !
'
#
/
'
4
4
6
#
/
!
'
*
connectfour.C
&
$ !
. #
#
# ( !
# /
' &
#
!
' ( '
!
# $ ! ! &
# $
'
# ' &
! #
#
&
&
#
#
&
&
#
/
/
&
#
*
Figure 22:
& &
' - '
! * /
' #
# !
&! #
& / # ' /
! #
'
& &
# ( ! ' &
! ( ' '
q !
'
# & $ ! ! #
Figure 21:
6
/ $ - ' '
&
q
#
!
&
/
/ &
'
* (
! ,
/ &
^
]]
o
]]
d
e
d
cb
a