Recursion

์žฌ๊ท€ํ˜ธ์ถœ / ์ˆœํ™˜์ด๋ž€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‚˜ ํ•จ์ˆ˜๊ฐ€ ์ˆ˜ํ–‰๋„์ค‘ ์ž๊ธฐ ์ž์‹ ์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ธฐ๋ฒ•์ด๋‹ค. ์ •์˜์ž์ฒด๊ฐ€ ์ˆœํ™˜์ ์œผ๋กœ ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ์— ์ ํ•ฉํ•˜๋‹ค.

์ž๊ธฐ ์ž์‹ ์„ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ํ˜„์žฌ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ฐ™์€ ์œ ํ˜•์˜ ํ•˜์œ„์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค. ๋ฌธ์ œ๋ฅผ ํ•œ๋ฒˆ์— ํ•ด๊ฒฐํ•˜๊ธฐ๋ณด๋‹ค๋Š” ๊ฐ™์€ ์œ ํ˜•์˜ ํ•˜์œ„์ž‘์—…์œผ๋กœ ๋ถ„ํ• ํ•˜์—ฌ ์ž‘์€ ๋ฌธ์ œ๋ถ€ํ„ฐ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์ˆœํ™˜ ํ•จ์ˆ˜์—์„œ ํƒˆ์ถœํ•  ์ˆ˜ ์žˆ๋Š” basecase๊ฐ€ ๋ฐ˜๋“œ์‹œ ํ•˜๋‚˜ ์ด์ƒ ์žˆ์–ด์•ผํ•œ๋‹ค.

์ˆœํ™˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ๋Š” ์ˆœํ™˜ ํ˜ธ์ถœ์„ ํ•˜๋Š” ๋ถ€๋ถ„(recursive case)๊ณผ ์ˆœํ™˜ ํ˜ธ์ถœ์„ ๋ฉˆ์ถ”๋Š” ๋ถ€๋ถ„(base case)์ด ์žˆ๋‹ค. ๋งŒ์•ฝ ๋ฉˆ์ถ”๋Š” ๋ถ€๋ถ„์ด ์—†๋‹ค๋ฉด ์‹œ์Šคํ…œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๊นŒ์ง€ ๋ฌดํ•œํžˆ ํ˜ธ์ถœํ•˜๊ฒŒ ๋œ๋‹ค.

๋ฉˆ์ถ”๋Š” ๋ถ€๋ถ„์ด ๋ฐ˜๋“œ์‹œ ์žˆ์–ด์•ผํ•œ๋‹ค. ์—†๋‹ค๋ฉด ์‹œ์Šคํ…œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ• ๋•Œ๊นŒ์ง€ ๋ฌดํ•œ ํ˜ธ์ถœ

์ˆœํ™˜๊ณผ ๋ฐ˜๋ณต

์ˆœํ™˜

๋ฐ˜๋ณต

์ˆœํ™˜ ํ˜ธ์ถœ ์ด์šฉ(์žฌ๊ท€ํ•จ์ˆ˜)

for ๋˜๋Š” while

๊ตฌํ˜„ ์†๋„๊ฐ€ ๋น ๋ฆ„

์ˆ˜ํ–‰ ์†๋„๊ฐ€ ๋น ๋ฆ„

์ˆœํ™˜์ ์ธ ๋ฌธ์ œ์—์„œ๋Š” ์ž์—ฐ์Šค๋Ÿฌ์šด ๋ฐฉ๋ฒ•์ด๋‚˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ์˜ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.

์ˆœํ™˜์ ์ธ ๋ฌธ์ œ์— ๋Œ€ํ•ด์„œ๋Š” ํ”„๋กœ๊ทธ๋žจ ์ž‘์„ฑ์ด ์•„์ฃผ ์–ด๋ ค์šธ ์ˆ˜๋„ ์žˆ๋‹ค.

  • ์‹คํ–‰์‹œ๊ฐ„ : ์ปดํ“จํ„ฐ๊ฐ€ ์‹คํ–‰ํ•˜๋Š” ์‹œ๊ฐ„

  • ๊ฐœ๋ฐœ์‹œ๊ฐ„ : ์ฝ”๋”ฉํ•˜๋Š” ์‹œ๊ฐ„

long int fact(int n){
  if(n<=1) return 1; // basecase
  else return(n*fact(n-1));
}
long int fact(int n){
  int i, res = 1;
  if(n<=1)return 1;
  else{
    for(i=n; i>=0;i--){
      res = res * i;
    }
    return res;
  }
}

๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ• ๋‹ค O(n) ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค. ์ˆœํ™˜ ํ˜ธ์ถœ์€ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์œผ๋‚˜ ์ˆ˜ํ–‰์‹œ๊ฐ„๊ณผ ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ์–ด์„œ๋Š” ๋น„ํšจ์œจ์ ์ธ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ ๊ฐ ๋ฌธ์ œ์˜ ๊ฒฝ์šฐ์— ๋งž๊ฒŒ ๋ฐ˜๋ณต๊ณผ ์ˆœํ™˜์„ ์„ ํƒํ•ด ํ’€์–ด์•ผํ•œ๋‹ค. ( Dynamic Programming์—์„œ ์ค‘์š” )

์‹ค์Šต

  • ์ˆœํ™˜

#include <stdio.h>

int factorial(int n){
    if(n<=1) return 1;
    else return (factorial(n-1)*n);
}
  • ๋ฐ˜๋ณต

#include <stdio.h>

int factorial(int n){
    int res = 1;
    if( n<=1 ) return res;
    else{
        for(int i = 2; i<=n;i++) res*=i;
        return res;
    }    
}

๊ฑฐ๋“ญ์ œ๊ณฑ ๊ตฌํ•˜๊ธฐ(x^n)

์ˆซ์ž x์˜ n์ œ๊ณฑ ๊ฐ’์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ

  • ์ˆœํ™˜

int power(int x, int n){
    if(n==0)return 1;
    else return (x*power(x,n-1));
}

์ด๋ ‡๊ฒŒ ํ•ด๋„ ๋˜๋‚˜ n์ด ์ง์ˆ˜์ธ ๊ฒฝ์šฐ์™€ ํ™€์ˆ˜์ธ ๊ฒฝ์šฐ๋ฅผ ๋‚˜๋ˆ ์„œ ๊ตฌํ•˜๋ฉด ์—ฐ์‚ฐ๋Ÿ‰์ด ๋” ์ค„์–ด๋“ ๋‹ค.

int power(int x, int n){
    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^10
>> 10%2==0, power(4,5)
>> 5%2==1, 4*power(16,2)
>> 4%2==0, 4*power(256,1)
>> 1%2==1, 4*256(256*256,0) == 4*256*1

์—ฌ๊ธฐ์„œ k๋ฒˆ์˜ ์ˆœํ™˜ ํ˜ธ์ถœ์ด ์ผ์–ด๋‚œ๋‹ค. ํ•œ๋ฒˆ ์ˆœํ™˜ํ˜ธ์ถœ์ด ์ผ์–ด๋‚ ๋•Œ๋งˆ๋‹ค 1๋ฒˆ์˜ ๊ณฑ์…ˆ๊ณผ 1๋ฒˆ์˜ ๋‚˜๋ˆ—์…ˆ์ด ์ผ์–ด๋‚œ๋‹ค. ์ „์ฒด ์—ฐ์‚ฐ ์ˆ˜๋Š” k=log2(N)์— ๋น„๋ก€ํ•œ๋‹ค. ์ฆ‰, ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(log2(n))์ด๋‹ค.

  • ๋ฐ˜๋ณต

int power(int x, int n){
    int res = 1;
    if(n==0)return res;
    else{
        for(int i=1; i<=n;i++){
            res*=x;
        }
        return res;
    }
}

์—ฌ๊ธฐ์„œ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(n)์ด๋‹ค.

ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด

ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์€ ์ •์˜ ์ž์ฒด๋Š” ์ˆœํ™˜์ ์ด๋‚˜ ์ˆœํ™˜ ํ˜ธ์ถœ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋น„ํšจ์œจ์ ์ธ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์‹œ์ด๋‹ค.

  • ์ˆœํ™˜

int fib(int n){
    if(n==0)return 0;
    if(n==1)return 1;
    return (fib(n-1)+fib(n-2));
}
fib(6)
>> fib(5) + fib(4)
>> fib(4)+fib(3) + fib(3)+fib(2)
>> fib(3)+fib(2) + fib(2)+fib(1) + fib(2)+fib(1) + fib(1)+fib(0)

์œ„์™€ ๊ฐ™์ด ๊ฐ™์€ ํ•ญ์ด ๊ณ„์†ํ•ด์„œ ์ค‘๋ณตํ•ด์„œ ๊ณ„์‚ฐ๋˜๋ฏ€๋กœ ๋น„ํšจ์œจ ์ ์ด๋‹ค.

  • ๋ฐ˜๋ณต

int fib(int n){
    if(n<2)return n;
    else{
        int i, current=1, last=0, tmp;
        for(i=2;i<=n;i++){
             tmp = current;
             current += last;
             last = tmp;
        }
        return current;
    }
}

Tripple ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด

1, 2, 3, 6, 11, 20, 37, 68 ...

  • ์ˆœํ™˜

int fib_tri(int n){
    if(n==0) return 0;
    if(n==1) return 1;
    if(n==2) return 2;
    else{
          return  fib_tri(n-3)+fib_tri(n-2)+fib_tri(n-1);
    }
}

ํ•˜๋…ธ์ด ํƒ‘

๋ง‰๋Œ€ A์— ์žˆ๋Š” ์›ํŒ์„ ๋ง‰๋Œ€ C๋กœ ์˜ฎ๊ธฐ๋Š” ๋ฌธ์ œ์ด๋‹ค.

์กฐ๊ฑด

  1. ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์›ํŒ๋งŒ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.

  2. ๋งจ ์œ„์— ์žˆ๋Š” ์›ํŒ๋งŒ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.

  3. ํฌ๊ธฐ๊ฐ€ ์ž‘์€ ์›ํŒ ์œ„์— ํฐ ์›ํŒ์ด ์Œ“์ผ ์ˆ˜ ์—†๋‹ค.

  4. ์ค‘๊ฐ„์˜ ๋ง‰๋Œ€๋ฅผ ์ž„์‹œ์ ์œผ๋กœ ์ด์šฉํ•  ์ˆ˜ ์žˆ์œผ๋‚˜ ์•ž์˜ ์กฐ๊ฑด๋“ค์„ ์ง€์ผœ์•ผ ํ•œ๋‹ค.

1๋‹จ๊ณ„. ๋ง‰๋Œ€ A์—์„œ ์›๋ฐ˜(1~n-1)์„ ๋ง‰๋Œ€ C๋ฅผ ์ด์šฉํ•ด ๋ง‰๋Œ€ B๋กœ ์˜ฎ๊ธด๋‹ค. Hanoi(m-1,a,c,b)

2๋‹จ๊ณ„. ๋ง‰๋Œ€ A์—์„œ ์›๋ฐ˜(n)์„ ๋ง‰๋Œ€ C๋กœ ์˜ฎ๊ธด๋‹ค. if(m==1)

3๋‹จ๊ณ„. ๋ง‰๋Œ€ B์—์„œ ์›๋ฐ˜(1~n-1)์„ ๋ง‰๋Œ€ A๋ฅผ ์ด์šฉํ•ด ๋ง‰๋Œ€ C๋กœ ์˜ฎ๊ธด๋‹ค. Hanoi(m-1,b,a,c)

  • ์ˆœํ™˜

void hanoi(int n, char a, char b, char c){
    if(n==1)printf("์›๋ฐ˜%d์ด ๋ง‰๋Œ€[%c]์—์„œ ๋ง‰๋Œ€[%c]๋กœ ์˜ฎ๊ฒจ์ง‘๋‹ˆ๋‹ค.",n,a,c);
    else{
        hanoi(n-1,a,c,b);
        printf("์›๋ฐ˜%d์ด ๋ง‰๋Œ€[%c]์—์„œ ๋ง‰๋Œ€[%c]๋กœ ์˜ฎ๊ฒจ์ง‘๋‹ˆ๋‹ค.",n,a,c);
        hanoi(n-1,b,a,c);
    }
}

Ackermann ํ•จ์ˆ˜

์œ„ํ‚ค๋ฐฑ๊ณผ ์•„์ปค๋งŒ ํ•จ์ˆ˜์— ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…์ด ์žˆ๋‹ค.

  • ์ˆœํ™˜

int ackermann(int m, int n){
    if(m==0)return n+1;
    if(m>0 && n==0)return ackermann(m-1,1);
    return ackermann(m-1,ackermann(m,n-1));
}
  • ๋ฐ˜๋ณต

basecase๊ฐ€ ์—†๋‹ค๋ฉด ์ˆœํ™˜์ด ์•„๋‹ˆ๋‹ค! ์ด๊ฒƒ์— ์ดˆ์ ์„ ๋‘๊ณ  ์ฝ”๋“œ๋ฅผ ์งœ๋ณด์•˜๋‹ค.

int ackermann_loop(int m, int n){
    int mm = m, nn = n;
    while(mm!=0){
        if(nn == 0) nn = 1;
        else nn = ackermann_loop(mm,nn-1);
        mm--;
        printf("nn : %d \n",nn);
    }
    return nn+1;
}

2์ฐจ์› ๋ฐฐ์—ด๋กœ ๊ตฌํ˜„ํ–ˆ์„ ๋•Œ๋Š” ๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด ๊ณ„์†ํ•ด์„œ ๋ฒ”์œ„๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ๋ฌธ์ œ๋ฐœ์ƒํ–ˆ๋‹ค.

int A[100][100];
int ackermann_loop(int m, int n){
    for(int i = 0;i<=m;i++){
        for(int j = 0; j<=50; j++){
            if(i==0)A[i][j]=n+1;
            else if(j==0)A[i][j]=A[i-1][j];
            else{
                int tmp = A[i][j-1];
                A[i][j] = A[i-1][tmp];
            }
        }
    }
    return A[m][n];
}

๋˜ ๊ทœ์น™์„ ์ฐพ์•„์„œ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค.

int Acker_nonrecursive3(int m, int n)
     int i;
     int val=2;

     if(m==0) return n+1;
     if(m==1) return n+2;
     if(m==2) return 2*n+ 3;
     if(m==3) {  
        // return pow(2, n+3) -3;  ๋˜๋Š” ์•„๋ž˜ for loop ์œผ๋กœ 
        for(i=1; i<n+3; i++)
            val *=2;

        return val -3;
     }

     if(m==4){
        for(i=1; i< n+3; i++)
            val *=val;
        return val=val-3;
     }
}

์™„์ „ ํƒ์ƒ‰

์™„์ „ ํƒ์ƒ‰์€ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ฃผ์ € ์—†์ด ๋‹ค ๊ณ„์‚ฐํ•˜๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์˜๋ฏธํ•œ๋‹ค.

์žฌ๊ท€ ํ˜ธ์ถœ์€ ๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ•์„ ์ „๋ถ€ ๋งŒ๋“ค์–ด ๋ณด๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์™„์ „ ํƒ์ƒ‰(Exhaustive Search)์ด๋ผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์–ด๋–ค ๋ฌธ์ œ๋ฅผ ์™„์ „ ํƒ์ƒ‰์œผ๋กœ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ•„์š”ํ•œ ๊ณผ์ •์€ ๋Œ€๋žต ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. 1. ์™„์ „ ํƒ์ƒ‰์€ ์กด์žฌํ•˜๋Š” ๋ชจ๋“  ๋‹ต์„ ํ•˜๋‚˜์”ฉ ๊ฒ€์‚ฌํ•˜๋ฏ€๋กœ, ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์€ ๊ฐ€๋Šฅํ•œ ๋‹ต์˜ ์ˆ˜์— ์ •ํ™•ํžˆ ๋น„๋ก€ํ•œ๋‹ค. ์ตœ๋Œ€ ํฌ๊ธฐ์˜ ์ž…๋ ฅ์„ ๊ฐ€์ •ํ–ˆ์„ ๋•Œ ๋‹ต์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ , ์ด๋“ค์„ ๋ชจ๋‘ ์ œํ•œ ์‹œ๊ฐ„์•ˆ์— ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์„์ง€ ๊ฐ€๋Š ํ•ด๋ณด๊ณ  ์ ์šฉํ•ด์•ผํ•œ๋‹ค. 2. ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๋‹ต์˜ ํ›„๋ณด๋ฅผ ๋งŒ๋“œ๋Š” ๊ณผ์ •์„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์„ ํƒ์œผ๋กœ ๋‚˜๋ˆˆ๋‹ค. ๊ฐ๊ฐ์˜ ์„ ํƒ์€ ๋‹ต์˜ ํ›„๋ณด๋ฅผ ๋งŒ๋“œ๋Š” ๊ณผ์ •์˜ ํ•œ ์กฐ๊ฐ์ด๋‹ค. 3. ๊ทธ์ค‘ ํ•œ ์กฐ๊ฐ์„ ์„ ํƒํ•ด ๋‹ต์˜ ์ผ๋ถ€๋ฅผ ๋งŒ๋“ค๊ณ , ๋‚˜๋จธ์ง€ ๋‹ต์„ ์žฌ๊ท€ ํ˜ธ์ถœ์„ ํ†ตํ•ด ์™„์„ฑํ•œ๋‹ค. 4. ์กฐ๊ฐ์ด ํ•˜๋‚˜๋ฐ–์— ๋‚จ์ง€ ์•Š์€ ๊ฒฝ์šฐ, ํ˜น์€ ํ•˜๋‚˜๋„ ๋‚จ์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” ๋‹ต์„ ์ƒ์„ฑํ–ˆ์œผ๋ฏ€๋กœ basecase๋กœ ์„ ํƒํ•ด ์ฒ˜๋ฆฌํ•œ๋‹ค.

๊ด€๋ จ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด ๋ณด๋Ÿฌ๊ฐ€๊ธฐ

Last updated