2012년 봄학기
강원대학교 컴퓨터과학전공 문양세
이산수학(Discrete Mathematics)
재귀 알고리즘
(Recursive Algorithms)
Discrete Mathematics by Yang-Sae Moon Page 2
Introduction 3.5 Recursive Algorithms
Recursive definitions can be used to describe algorithms as
well as functions and sets.
(재귀적 정의를 수행한 경우, 손쉽게 알고리즘의 함수/집합으로 기술할 수 있다.)
예제: A procedure to compute an.
procedure power(a≠0: real, nN)
if n = 0 then return 1
else return a · power(a, n−1)
Discrete Mathematics by Yang-Sae Moon Page 3
Efficiency of Recursive Algorithms
The time complexity of a recursive algorithm may depend
critically on the number of recursive calls it makes.
(재귀 호출에서의 시간 복잡도는 재귀 호출 횟수에 크게 의존적이다.)
예제: Modular exponentiation to a power n can take log(n)
time if done right, but linear time if done slightly
differently. (잘하면 O(log(n))이나, 조금만 잘못하면 O(n)이 된다.)
• Task: Compute bn mod m, where
m≥2, n≥0, and 1≤b<m.
3.5 Recursive Algorithms
Discrete Mathematics by Yang-Sae Moon Page 4
Modular Exponentiation Algorithm #1
Uses the fact that
• bn = b·bn−1 and that
• x·y mod m = x·(y mod m) mod m.
3.5 Recursive Algorithms
Note this algorithm takes (n) steps!
procedure mpower(b≥1,n≥0,m>b N)
{Returns bn mod m.}
if n=0 then return 1;
else return (b·mpower(b,n−1,m)) mod m;
Discrete Mathematics by Yang-Sae Moon Page 5
Modular Exponentiation Algorithm #2
Uses the fact that
• b2k = bk·2 = (bk)2,
• x·y mod m = x·(y mod m) mod m, and
• x·x mod m = (x mod m)2 mod m.
3.5 Recursive Algorithms
What is its time complexity?
procedure mpower(b,n,m) {same signature}
if n=0 then return 1
else if 2|n then
return mpower(b,n/2,m)2 mod m
else return (mpower(b,n−1,m)·b) mod m
(첫 번째 mpower()는 한번 call되고, 그 값을 제곱하는 것임)
(log n) steps
Discrete Mathematics by Yang-Sae Moon Page 6
A Slight Variation of Algorithm #2
Nearly identical but takes (n) time instead!
3.5 Recursive Algorithms
The number of recursive calls made is critical.
procedure mpower(b,n,m) {same signature}
if n=0 then return 1
else if 2|n then
return (mpower(b,n/2,m)·mpower(b,n/2,m)) mod m
else return (mpower(b,n−1,m)·b) mod m
Discrete Mathematics by Yang-Sae Moon Page 7
Recursive Euclid’s Algorithm (예제)
Note recursive algorithms are often simpler to code than
iterative ones… (Recursion이 코드를 보다 간단하게 하지만…)
However, they can consume more stack space, if your
compiler is not smart enough.
(일반적으로, recursion은 보다 많은 stack space를 차지한다.)
3.5 Recursive Algorithms
procedure gcd(a,bN)
if a = 0 then return b
else return gcd(b mod a, a)
Discrete Mathematics by Yang-Sae Moon Page 8
Recursion vs. Iteration (1/3) 3.5 Recursive Algorithms
Factorial – Recursion
procedure factorial(nN)
if n = 1 then return 1
else return n factorial(n – 1)
Factorial – Iteration
procedure factorial(nN)
x := 1
for i := 1 to n
x := i x
return x
Discrete Mathematics by Yang-Sae Moon Page 9
Recursion vs. Iteration (2/3) 3.5 Recursive Algorithms
Fibonacci – Recursion
procedure fibonacci(n: nonnegative integer)
if (n = 0 or n = 1) then return n
else return (fibonacci(n–1) + fibonacci(n–2))
Fibonacci – Iteration
procedure fibonacci(n: nonnegative integer)
if n = 0 then return 0
else
x := 0, y := 1
for i := 1 to n – 1
z := x + y, x := y, y := z
return z
Discrete Mathematics by Yang-Sae Moon Page 10
3.5 Recursive Algorithms
재귀(recursion)는 프로그램을 간단히 하고, 이해하기가 쉬
운 장점이 있는 반면에,
각 호출이 스택을 사용하므로, depth가 너무 깊어지지 않도
록 조심스럽게 프로그래밍해야 함
컴퓨터에게 보다 적합한 방법은 반복(iteration)을 사용한 프
로그래밍이나, 적당한 범위에서 재귀를 사용하는 것이 바람
직함
Recursion vs. Iteration (3/3)
Discrete Mathematics by Yang-Sae Moon Page 11
Merge Sort (예제) (1/2)
The merge takes (n) steps, and merge-sort takes
(n log n).
3.5 Recursive Algorithms
procedure sort(L = 1,…, n)
if n>1 then
m := n/2 {this is rough ½ -way point}
L := merge(sort(1,…, m), sort(m+1,…, n))
return L
Discrete Mathematics by Yang-Sae Moon Page 12
The Merge Routine
3.5 Recursive Algorithms
procedure merge(A, B: sorted lists)
L = empty list
i:=0, j:=0, k:=0
while i<|A| j<|B| {|A| is length of A}
if i=|A| then Lk := Bj; j := j + 1
else if j=|B| then Lk := Ai; i := i + 1
else if Ai < Bj then Lk := Ai; i := i + 1
else Lk := Bj; j := j + 1
k := k+1
return L
Merge Sort (예제) (2/2) – skip
Discrete Mathematics by Yang-Sae Moon Page 13
Homework #5 3.5 Recursive Algorithms