์ํ์ด๋?
์ด๋ค ์๊ณ ๋ฆฌ์ฆ์ด๋ ํจ์๊ฐ ์๊ธฐ ์์ ์ ํธ์ถํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ฒ
=> ํจ์ ํธ์ถ์ ์ค๋ฒํค๋ (์ค์ ํ๋ก๊ทธ๋๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐX, ๋ญ๋น์๊ฐ!!)
โ
๊ตฌ์กฐ
โ ์ํ์ ๋ฉ์ถ๋ ๋ถ๋ถ
ย ย ย ย ๐จ ์๋ค๋ฉด ์์คํ
์คํ์ ๋ค ์ฌ์ฉํ ๋๊น์ง ์ํ์ ์ผ๋ก ํธ์ถํ๋ค๊ฐ ์ค๋ฅ๋ฅผ ๋ด๋ฉด์ ๋ฉ์ถค
โก ์ํ ํธ์ถ์ ํ๋ ๋ถ๋ถ
๋ฐ๋ณต์ด๋?
for๋ while ๋ฑ์ ๋ฐ๋ณต๊ตฌ์กฐ๋ก ๋ํ์ด ํ๋ ๋ฐฉ๋ฒ
=> ์ํ์ ์ธ ๋ฌธ์ ์ ๋ํด์๋ ์ด๋ ค์ธ ์ ์์
=> ์ํ ์๋๊ฐ ๋น ๋ฆ
โ๏ธ ํฉํ ๋ฆฌ์ผ
int factorial (int n) { // O(n)
if(n <= 1) return 1; // ์ํ์ ๋ฉ์ถ๋ ๋ถ๋ถ
else return (n * factorial (n-1)); // ์ํ์ ํธ์ถํ๋ ๋ถ๋ถ
}
f(n) = 1 + f(n-1) = f(1) + f(n-1) => O(n)int factorial_iter(int n) { // O(n)
int i, result = 1;
for (i=1; i<=n; i++)
result = result * i;
return(result);
}
โ๏ธ ๊ฑฐ๋ญ์ ๊ณฑ๊ฐ ๊ณ์ฐ
double slow_power(double x, int n) { // O(n)
int i;
double result = 1.0;
for (i=0; i<n; i++)
result = result * x;
return(result);
}
n์ด ์ง์ | n์ด ํ์ |
---|---|
power(x, n) = power(xยฒ, n/2) = (xยฒ)^n/2 = x^2(n/2) = x^n | power(x, n) = xยทpower(xยฒ, (n-1)/2) = xยท(xยฒ)^(n-1)/2 = xยทx^(n-1) = x^n |
double power(double x, int n) { // O(logn)
if (n==0) return 1;
else if ((n%2) == 0)
return power(x*x, n/2)'
else return x*power(x*x, (n-1)/2);
}
ํ ๋ฒ์ ์ํ ํธ์ถ์ ํ ๋๋ง๋ค ๋ฌธ์ ์ ํฌ๊ธฐ๋ ์ฝ ์ ๋ฐ์ผ๋ก ์ค์ด๋ฆ
2^k -> 2^(k-1) -> 2^(k-2) -> ... -> 2^1 -> 2^0 => n=2^k => logn=k => O(logn)
โ๏ธ ํผ๋ณด๋์น ์์ด์ ๊ณ์ฐ
int fib(int n) { // O(2^n)
if (n==0) return 0;
if (n==1) return 1;
return (fib(n-1) + fib(n-2));
}
T(n) = T(n-1) + T(n-2) + C => O(2^1.7n)
ex) fib(6) -> fib( )ํจ์ 25๋ฒ ํธ์ถ => ๋นํจ์จ์
int fib_iter(int n) { // O(n)
if (n==0) return 0;
if (n==1) return 1;
int pp = 0;
int p = 1;
int result = 0;
for (int i=2; i<=n; i++) {
result = p + pp;
pp = p;
p = result;
}
return result;
}
โ๏ธ ํ๋ ธ์ดํ ๋ฌธ์
โ
๋ฌธ์
๋ง๋ A์ ์์ฌ์๋ ์ํ 3๊ฐ๋ฅผ ๋ง๋ C๋ก ์ฎ๊ธฐ๋ ๊ฒ
โ
์กฐ๊ฑด
ยท ํ ๋ฒ์ ํ๋์ ์ํ๋ง ์ด๋ ๊ฐ๋ฅ
ยท ๋งจ ์์ ์๋ ์ํ๋ง ์ด๋ ๊ฐ๋ฅ
ยท ํฌ๊ธฐ๊ฐ ์์ ์ํ ์์ ํฐ ์ํ ์์ผ ์ ์์
์ํ | 1๊ฐ | 2๊ฐ | 3๊ฐ | ... | n๊ฐ |
---|---|---|---|---|---|
์ด๋ | 1๋ฒ | 3๋ฒ | 7๋ฒ | ... | (2^n -1)๋ฒ |
#include <stdio.h>
void hanoi_tower(int n, char from, char tmp, char to) {
if (n==1) printf("์ํ 1์ %c์์ %c์ผ๋ก ์ฎ๊ธด๋ค. \n", from, to);
else {
hanoi_tower(n-1, from, to, tmp);
printf("์ํ %c์์ %c์ผ๋ก ์ฎ๊ธด๋ค.\n", n, from, to);
hanoi_tower(n-1, tmp, from, to);
}
}
int main(void) {
hanoi_tower(4, 'A', 'B', 'C');
return 0;
}
๐ ๋ฐ๋ณต์ ์ธ ํํ๋ก ๋ฐ๊พธ๊ธฐ ์ด๋ ค์ด ์ํ