๐Ÿค– 2. ์ˆœํ™˜

Yeonsu Summerยท2022๋…„ 7์›” 4์ผ
0

์ž๋ฃŒ๊ตฌ์กฐ

๋ชฉ๋ก ๋ณด๊ธฐ
2/4
post-thumbnail
post-custom-banner

์ˆœํ™˜์ด๋ž€?
์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‚˜ ํ•จ์ˆ˜๊ฐ€ ์ž๊ธฐ ์ž์‹ ์„ ํ˜ธ์ถœํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•
=> ํ•จ์ˆ˜ ํ˜ธ์ถœ์˜ ์˜ค๋ฒ„ํ—ค๋“œ (์‹ค์ œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„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)
f(n-1) = 1 + f(n-2)
f(n-2) = 1 + f(n-3)
...
f(2) = 1 + f(1) = 1 + 1 = 2
  • ๋ฐ˜๋ณต
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;
}

๐Ÿ“ ๋ฐ˜๋ณต์ ์ธ ํ˜•ํƒœ๋กœ ๋ฐ”๊พธ๊ธฐ ์–ด๋ ค์šด ์ˆœํ™˜

  • ๊ผฌ๋ฆฌ ์ˆœํ™˜(tail recursion) : ์ˆœํ™˜ ํ˜ธ์ถœ์ด ์ˆœํ™˜ ํ•จ์ˆ˜์˜ ๋งจ ๋์—์„œ ์ด๋ฃจ์–ด์ง€๋Š” ํ˜•ํƒœ์˜ ์ˆœํ™˜ => ๋ฐ˜๋ณต์œผ๋กœ ๋ณ€ํ™˜ ๊ฐ€๋Šฅ
    ex) return n*factorial(n-1);
  • ๋จธ๋ฆฌ ์ˆœํ™˜(head recursion) : ์—ฌ๋Ÿฌ ๊ตฐ๋ฐ์—์„œ ์ž๊ธฐ ์ž์‹ ์„ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ(multi recursion) => ๋ฐ˜๋ณต์œผ๋กœ ์‰ฝ๊ฒŒ ๋ณ€ํ™˜ ๋ถˆ๊ฐ€๋Šฅ
    ex) return factorial(n-1)*2
    ex) ํ•˜์ด๋…ธํƒ‘
profile
๐Ÿ€ an evenful day, life, journey
post-custom-banner

0๊ฐœ์˜ ๋Œ“๊ธ€