적어도 하나의 base case, 즉 순환되지 않고 종료되는 case가 있어야함

모든 case는 결국 base case로 수렴해야 함

모든 순환함수는 반복문(iteration)으로 대체가 가능하다.

그역도 성립함. 즉 모든 반복문은 resursion으로 표현 가능함

순환함수는 복잡한 알고리즘을 단순하고 알기쉽게 표현하는 것을 가능하게 함

하지만 함수 호출에 따른 오버해드가 있음 (매개변수 전달, 액티베이션 프레임 생성 등)

Recursion

1~n 까지의 합을 구하라. (n >=1)

public static int func(int n) {
    if (n <= 0)
        return 0;
    else
        return n + func(n-1);
}

Factorial: n! ( n>0, n==0:n=1)

public static int factorial(int n) {
    if (n==0)
        return 1;
    else
        return n * factorial(n-1);
}

Fibonacci number: f=0, f1=1

public static int fibonacci(int n) {
    if (n<2)
        return n;
    else
        return fibonacci(n-1) + fibonacci(n-2);
}

Euclid method (최대공약수)

: m>=n 인 두 양의 정수 m과 n에 대해서 m이 n의 배수이면, gcd(m,n)=n 이고, 그렇지 않으면 gcd(m, n) = gcd(n, m%n) 이다.

public static int gcd(int p, int q) {
    if (q==0)
        return p;
    else
        return gcd(q, p%q);
}

문자열의 길이 계산

public static int length(String str) {
    if (str.equals(""))
        return 0;
    else
        return 1 + length(str.substring(1));
}

Sequential search

public static int search(int[] data, int begin, int end, int target) {
    if (begin > end)
        return -1;
    else if (target == data[begin])
        return begin;
    else
        return search(data, begin+1, end, target);
}
public static int search(int[] data, int begin, int end, int target) {
    if (begin > end)
        return -1;
    else {
        int middle = (begin+end) / 2;
        if (data[middle] == target)
            return middle;

        int index = search (data, begin, middle-1, target);

        if (index != -1)
            return index;
        else 
            return search(data, middle+1, end, target);
    }
}

Find Max

public static int findMax(int[] data, int begin, int end) {
    if (begin == end)
        return data[begin];
    else
        return Math.max(data[begin], findMax(data, begin+1, end);
}
public static int findMax(int[] data, int begin, int end) {
    if (begin == end)
        return data[begin];
    else {
        int middle = (begin+end) / 2;
        int max1 = findMax(data, begin, middle);
        int max2 = findMax(data, middle+1, end);
        return Math.max(max1, max2);
    }
}

Binary search (데이터는 순차적으로 정렬되어 있어야 한다.)

public static int binarySearch(String[] items, String target, int begin, int end) {
    if (begin > end)
        return -1;
    else {
        int middle = (begin+end) / 2;
        int compResult = target.compareTo(items[middle]);
        if (compResult == 0)
            return middle;
        else if (compResult < 0)
            return binarySearch(itmes, target, begin, middle-1);
        else
            return binarySearch(items, target, middle+1, end);
    }
}

results matching ""

    No results matching ""