콘텐츠로 건너뛰기

재귀적 사용

GNU   GNU….
   GNU is Not Unix

  GNU, 참 재미있는 이름이다. GNU라는 이름 자체가 재귀적으로 사용되어있다. 약자는 ‘GNU’이고 풀어쓰면 ‘GNU is Not Unix’라고 쓴다.

  2학년때 C를 배우면서 함수의 재귀적 사용을 이용한 팩토리알 계산 프로그램을 보고 참 신기했던 적이 있었다. 예제 코드를 보기 전까지는 그런 사용법을 본적도 없었고 상상조차 해 본적이 없었기 때문이었다.

  생각하는 방법을 바꾸고 새로운 시각으로 문제에 접근해 보면 가끔 너무나도 기발한 해결법이 튀어나온다. 그건 마치 ‘2+2+2+2+2’라는 긴 수학 식에서 ‘2*5’라는 짧은 식을 발견하는 것과 같다. 반복되는 덧셈 과정에서 발생할 수 있는 실수를 획기적으로 줄일 수 있고 식 조차도 간소화되어버린다. 다만 내부적으로는 덧셈을 계산하는 것 보다는 훨씬 부하가 가중될 수 있지만 말이다. 덧셈보다는 곱셉이 어렵잖아요^^ㅋ

  긴 코드를 붙잡고 씨름을 하다가 갑작스레 그 모든 코드를 한줄로 해결할 수 있는 방법이 머릿속에 떠올랐을땐 혼자서 환호한다.

유레카!!

  그 순간만큼은 나도 아르키메데스가 목욕탕에서 부력을 발견했을때와 비견할만한 발견을 한 느낌이다. 순간 등골을 타고 온몸에 짜릿함이 전해진다.

class Factorial
{   
    static int op_Factorial(int n)
    {
        if(n==1)
            return 1;
        else
            return n*op_Factorial(n-1);
    }
    public static void main(String[] args)
    {
        int a;

        a = op_Factorial(5);
        System.out.println(“5!=”+a);
    }
}

  그냥 팩토이알 생각이 난 김에 자바의 메소드를 재귀적으로 이용해 5! 값을 구해내는 간단한 코드를 작성해 보았다.

  최근에 맥북을 장만한 후에 자바코드 작성을 위해서 Xcode를 설치 해 보았다. 잠깐 만져본게 전부이지만 재미있는 녀석같다. 뒤늦게 알았지만 맥OS X용 자바 컴파일러는 Xcode를 통해서 설치가된다. C컴파일러로는 GCC가 설치되고, 코코아라던가 카본처럼 윈도우즈에서는 볼 수 없었던 신기한 녀석들도 함께 설치가 되었다. 아직은 윈도우즈에서 코드를 작성하는것이 익숙해서 맥으로는 많이 헤맨다. 그래도 새로 보는 물건을 이리저리 연구해가는게 재미있어서 종종 만져보고는 있다^^ㅋ

  그러니까 오늘 일기의 결론은… 코드를 짜면서 잘 해결되지 않는 문제가 발생했을땐 잠깐 담배 한대 태우면서 여유를 가지고 그것에 대해서 다시한번 생각해 본다. 그러면 시간이 오래 지나지 않아 외칠 수 있다. “유레카!!” 싸인펜은 엉뚱한넘S

June 2, 2007 Update
  GCC는 Xcode와 함께 설치하지만 자바 컴파일러는 OSX에 기본적으로 설치되어있습니다. 당시엔 잘 몰라서 Xcode와 함께 설치된다고 기록해 두었네요^^ㅋ

6 개의 댓글

  1. 오, 재귀함수의 아주 기초적인 구조네요 ㅎㅎ
    그런데 저 함수에서는 -값을 넣으면 에러가 날 것 같네요 그래서~

    if(n > 1) return n * op_Factorial(n – 1);
    return 1;

    이런식으로 바꿔보는건 어떻까요 ^^;

  2. ㅋㅋ 제가 컴퓨터 과외를 하나 하는데요, 거기서 그 친구한테
    아주 간단한 알고리즘 짜는 숙제를 이런식으로 생각해보라고 하면서
    이것을 설명하는데 한참 걸렸던 기억이 나네요 ㅠㅠ
    함수에 익숙한 사람들이야 한번 보면 오호! 라고 느껴지는 이 방법이
    함수에 익숙하지 않은 사람들에게 설명하려면 정말 힘들다는걸 느꼈었습니다 ㅠㅠ
    GNU이름 너무 재밌어요 ㅋㅋㅋ 🙂

    1. expj님!! 과외도 하시는군요!!
      누군가에게 무언가를 이해시키고 가르쳐 주는게 상당히 어려울텐데, 멋지십니다^^ㅋ

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다