본문으로 바로가기

Recursion

category Algorithm/개념 2020. 12. 5. 15:16

재귀 함수

재귀 함수란 자기 자신을 반복적으로 호출하는 함수를 칭한다

재귀 함수는 두개의 조건이 필요한데

  • Base case : 자기 자신을 호출하지 않는 case, 반드시 하나의 경우가 필요하다 그렇지 않다면 무한 루프에 빠지게된다

  • Recursive case : 자기 자신을 호출하는 case, 이 케이스가 반복적 실행을 수행하는데, 이 case를 계속 실행할 경우 base case로 수렴해야한다

재귀 함수의 예시

팩토리얼

function factorial (n){
    if(n===0) return n;

    return n * factorial(n-1);
}

x^n구하기

function pow (number, c){
    if(c===0) return 1;

    return number * pow(number, c-1);
}

유클리드 호제법

function gcd(n,m){
    if(n%m===0) return m;

    return gcd(m, n%m);
}

이때까지 호제법을 구현할 때는 n이 m보다 크거나 같아야하는 줄 알았는데

m이 n보다 클 경우에는 첫번째 재귀에서 n과 m의 위치가 바뀌기 때문에 swap해 줄 필요가 없다

피보나치 수열

function fibonacci(n){
    if(n<2) return n;

    return fibonacci(n-1) + fibonacci(n-2);
}

상술한 재귀 함수들은 모두 base case로 if문을 가지고 있고

각기 다른 방식으로 recursive case를 가지고 있다

재귀 함수 디자인

재귀 함수에는 매개변수가 명시적이어야한다

함수를 하나 살펴보자

function search(array, data){
    for(let i=0; i<=array.length-1;i++){
        if(array[i]===data) return i;
    }
    return -1;
}

주어진 배열과 데이터를 가지고 배열 안에 데이터가 있는지 찾는 함수이다

값이 있다면 인덱스를, 없다면 -1을 반환한다

이 함수에는 시작 지점이 명시되어있지 않다

으레 그렇게 생각하듯 배열의 시작점은 0이니까 암시적으로 0을 시작점으로 해서 검색을 시작하는데

이렇게 하면 재귀 호출을 할 수가 없다

function searchRecursion(array, start, data){
    if(start>array.length-1) return -1;
    if(array[start] === data) return start;
    return searchRecursion(array, start+1, data);
}

위의 함수를 재귀 함수로 바꿔봤다

달라진 점은 매개변수로 시작점을 명시해 줬다는 것

이렇게 시작 지점을 명시해서 매개변수로 넘기게되면 자기 자신을 호출할 때

매개 변수를 수정해서 검색할 구간을 지정하면서 반복시킬 수 있게된다

'Algorithm > 개념' 카테고리의 다른 글

에라토스테네스의 체  (0) 2020.12.13
Recursion - 순열  (0) 2020.12.11
Recursion - 멱집합  (0) 2020.12.09
Recursion - N Queens Problem  (0) 2020.12.08
Recursion - 미로 찾기  (0) 2020.12.06