9/05/2011

What is a Recursive Call? and Make Fibonacci sequence function using Function of the Recursive Call type.

Recursive call is that this method call oneself.
Specially, Function uses this method.
Below C Source is example for recursive call function.
As you see, Function RF called the RF that is name of oneself.

Now I give you one question.
Please make Fibonacci sequence function using recursive call method.

You can see Fibonacci condition <here>

The LINUX that is name of OS is also recursive call type.
Some people said " LINUX is abbreviation of LINUX is not UNIX. "
Here, LINUX is call LINUX is not UNIX. In this sentence, LINUX is call LINUX is not UNIX again..
so..like that

(((((LINUX is not UNIX) is not UNIX) is not UNIX) is not UNIX) is not UNIX) is not UNIX

This case sink into the infinity roof because there is not escape condition. so we have to be careful when we use recursive call.

<English is very difficult.. Plz someone correct my poor sentence.>

재귀호출이란 자기가 자기자신을 호출하는 방식을 말한다.
특히 함수에서 이런 일을 한다.
이런 재귀호출 함수가 필요한 경우는
어떤 일을 하는 함수가 여러가지 조건에 대하여 똑같은 일을 할 필요가 있을 때이다.
그런데 다시 여러가지 조건이 주어지고 또다시 같은 일을 해야할 때 재귀 호출 함수를 쓴다.
이건 말로 표현하기 무척 어렵다.. ㅎㅎ

한가지 예제를 보자

----------------------------------------------

int RF(int A);

void main()
{
printf("%d\n", RF(5) );
}


int RF(int A)
{
int B=0;
if(A>1)
{
B = RF(A-1);
}

return A+B;
}

------------------------------------------------

RF함수는 1에서 입력된 숫자까지 더하는 함수이다.
RF함수를 보면 본문안에 다시 자기 자신을 호출하는 것을 볼 수 있다.
이런 방법을 재귀호출이라고 한다.

여기서 문제가 나갑니다.
이런 재귀호출 방식을 이용하여 피보나치 수열의 값을 구하는 함수를 구현해 보시오.
이번에는 좀 어려울 걸.. ㅋㅋ


이런 것도 재귀 호출일까?
LINUX 라는 운영체제가 있다.
그런데 이것은 LINUX is not UNIX의 약자라고 한다. 그런데 여기서 LINUX는 다시 LINUX is no UNIX를 만든다.

따라서 ..
(((((LINUX is not UNIX) is not UNIX) is not UNIX) is not UNIX) is not UNIX) is not UNIX

LINUX is not UNIX에서 LINUX가 계속 LINUX is not UNIX를 생성해 낸다..
이렇듯 재귀호출은 조건 문으로 break를 잘 해주지 않으면 무한 루프에 빠지기 쉽다..











6 comments:

  1. Anonymous5/9/11 23:26

    민현규
    #include
    int fi(int n);

    void main()
    {
    printf("%d\n",fi(11));
    }


    int fi(int n)
    {

    int a=0;
    int b=1;
    if(n>2)
    {
    a=fi(n-2);
    b=fi(n-1);
    }
    return a+b;

    }

    ReplyDelete
  2. Anonymous6/9/11 00:41

    JeKang's Code :

    #include

    int fiv(int Num);

    int main()
    {
    int Num=0;
    scanf("%d", &Num);
    printf("%d",fiv(Num));
    }

    int fiv(int Num)
    {
    int Answer=0;
    if(Num==0) return 0;
    else if(Num==1) return 1;
    else if(Num>1){
    Answer=fiv(Num-2)+fiv(Num-1);
    return Answer;
    }
    }

    ReplyDelete
  3. Anonymous6/9/11 00:44

    수정 민현규
    #include

    int fi(int n);

    void main()
    {
    int n;
    printf("피보나치수열fi(n):");
    scanf("%d",&n);
    printf("%d\n",fi(n));
    }


    int fi(int n)
    {

    int a=0;
    int b=1;
    if(n>=2)
    {
    a=fi(n-2);
    b=fi(n-1);
    return a+b;
    }
    else if(n==0) return a;
    else if(n==1) return b;

    }

    ReplyDelete
  4. #include


    int RecursiveF(int n);


    void main()
    {

    int x=20;
    for(int i=0; i<x; ++i)
    {
    printf("f(%d) = %d\n", i, RecursiveF(i) );
    }
    }



    int RecursiveF(int n)
    {
    if(n==0)
    return 0;

    if(n==1)
    return 1;

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

    ReplyDelete
  5. 다들 잘했다.
    어때? 반복적 방법과 재귀호출적 방법중 어떤게 프로그램 하기 편한것 같아?(자기 생각 코멘트 하나씩 달기~)
    ...
    하지만 재귀호출 방법은 반복적인 반복보다 프로그램에 부담을 많이 주는 방법이야.. 왜냐하면 함수안에 함수를 호출.. 또 다시 함수 호출.. 이렇게 안으로 들어갈수록 프로그램은 기억할게 많아지거든.
    함수를 마쳤을때 돌아가야하는 위치 그리고 계속 생성되는 지역 변수들(호출된 함수가 끝나기전까지 함수안에 변수들은 메모리를 차지함)..
    그래서 되도록 재귀함수는 안쓰는게 좋지만 컴퓨터 성능에 무리를 안준다면 알고리즘을 깔끔하게 완성시킬수 있지..
    그리고 재귀호출은 알고리즘 공부할때 논리적 사고를 키우기 위해 좋은 방법인것 같다..

    그럼 뿅~

    ReplyDelete
  6. Anonymous7/9/11 03:28

    재귀호출 방법은 이번에 처음 프로그래밍 해봐서 그런지 모르겠는데 반복문이 훨씬 편한거 같아요. 위에 형님이 적어두신거 처럼 함수안에 함수안에 함수... 계속 호출하기 때문에 호출 위치에 따라 결과를 예상하기가 너무 힘들었어요.

    논리적 사고를 키우는데는 좋은 방법인거 같은데, 장점보다는 단점이 많아서 아직 초보인 저는 반복문으로 만드는게 좋은거 같아요.ㅎㅎ

    ReplyDelete