알고리즘, 자료구조/자료구조

순환호출 (재귀호출) - 기초1 설명

바로이순간 2011. 12. 13. 00:56

#include <stdio.h>
void reverse(char *line){
    char ch=*line;
    if(ch==0) return;
    reverse(++line);
    printf("%c",ch);
}
 
int main() {
    reverse("abcd");
    return 0;
}
 
=============================================
 
위의 프로그램은 질문자가 질문한 프로그램과 동일한 일을 하는 프로그램입니다.
이제 설명을 시작해 보겠습니다.
 
main에서 reverse("abcd");를 호출합니다.
 
reverse(char *line)이 시작됩니다. 이때 line은 문자열 "abcd"의 시작위치를 가리킵니다.
    ch는 'a'가 됩니다. 'a'는 0(널문자)이 아닙니다.
    reverse[1](++line)이 호출됩니다.  이때 line은 문자열 "bcd"의 시작위치를 가리킵니다.
 
    reverse[1](char *line[1])이 시작됩니다.
        ch[1]은 'b'가 됩니다. 'b'는 0(널문자)이 아닙니다.
        reverse[2](++line[1])이 호출됩니다. 이때 line[1]은 문자열 "cd"의 시작위치를 가리킵니다.
 
        reverse[2](char *line[2])가 시작됩니다.
            ch[2]는 'c'가 됩니다. 'c'는 0(널문자)이 아닙니다.
            reverse[3](++line[2])이 호출됩니다. 이때 line[2]는 문자열 "d"의 시작위치를 가리킵니다.
 
            reverse[3](char *line[3])이 시작됩니다.
                ch[3]은 'd'가 됩니다. 'd'는 0(널문자)이 아닙니다.
                reverse[4](++line[3])이 호출됩니다. 이때 line[3]은 문자열 ""의 시작위치를 가리킵니다.
 
                    reverse[4](char *line[4])가 시작됩니다.
                        ch[4]는 '\0'가 됩니다. 널문자입니다.
                        reverse[4]는 종료되어 리턴이 일어납니다.
 
                아직 reverse[3]을 실행중에 있습니다.
                ch[3]을 찍어야 합니다. ************************ 드디어 'd'가 출력되었읍니다.
                reverse[3]이 종료됩니다.
 
            아직 reverse[2]를 실행중에 있습니다.
            ch[2] 를 찍어야 합니다. ************************** 그리고 'c'가 출력됩니다.
            reverse[2]가 종료됩니다.
 
        아직 reverse[1]을 실행중에 있습니다.
        ch[1]을 찍어야 합니다. ***************************** 그리고 'b'가 출력됩니다.
        reverse[1]이 종료됩니다.
 
    아직 reverse를 실행중에 있읍니다.
    ch를 찍어야 합니다. ********************************** 마침내 'a'가 출력됩니다.
    reverse가 종료됩니다.
 
이제 메인으로 돌아갑니다.