c·c++/c 프로그래밍

순환호출(재귀호출) 이해하기

바로이순간 2012. 3. 12. 15:55

1. 다음 함수에서 asterisk(5)를 호출할때 출력되는 *의 개수는?

 

void asterisk(int i) {

  if(i > 1){

    asterisk(i/2);

    asterisk(i/2);

  }

  printf("*");

}

 

 

asterisk(5) 가 호출됩니다.

asterisk(5) 가 실행됩니다 n 은 5입니다.

....asterisk(2) 를 호출합니다. 첫번째 호출 입니다.

.... asterisk[카피1](2) 가 실행됩니다. n은 2입니다.

.......... asterisk(1) 을 호출합니다. 첫번째 호출 입니다.

.......... asterisk[카피2](1) 이 실행됩니다. n은 1입니다.

................ 더이상 asterisk를 호출하지 않습니다.

................ 별을 한개 찍습니다.

................ asterisk[카피2] 가 끝납니다.

.......... asterisk(1) 을 호출합니다. 이것이 카피1의 두번째 호출입니다.

.......... asterisk[카피2](1) 이 실행됩니다. n은 1입니다.

................. 마찬가지로 별을 한개 찍고 끝납니다.

.......... 별은 한개 찍습니다. 카피1에서 찍는 것입니다.

.......... 카피1이 끝납니다.

 

....asterisk(2) 를 호출합니다. 원래 asterisk 의 두번째 호출입니다.

.......... 위의 과정을 꼭 같이 되풀이 해서 별 세개를 찍고 끝납니다.

 

.... 별한개를 찍습니다. 원래 asterisk 의 별을 찍는 부분입니다.

.... 원래의 asterisk 가 끝납니다.

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

이렇게 해서 별 7개를 찍었습니다.

 

 

2. 다음과 같은 함수를 호출하고 "recursive" 문자열을 입력한 다음,

엔터키를 눌렀다면 화면에 출력되는것은?

 

void unknown() {

  int ch;

  if( (ch = getchar()) != '\n')

    unknown();

 

  putchar(ch);

}

 

입력문자열이 abc 인 경우에 따져 봅니다.

 

unknown() 이 호출 됩니다.

unknown() 이 실행 됩니다.

....... ch = getchar() 표현에 의해서 입력문자를 한개 받습니다.

....... ch 는 a 의 아스키코드값 (97)을 가지고 있습니다.

....... ch 가 줄바꿈(엔터)이 아닙니다. 계속합니다.

....... unknown() 이 호출 됩니다.

....... unknown[카피1]() 이 실행 됩니다.

.............. ch = getchar() 표현에 의해서 입력문자를 한개 받습니다.

.............. ch[카피1] 은 b이 아스키코드값 (98)을 가지고 있습니다.

.............. ch 가 줄바꿈이 아닙니다. 계속합니다.

.............. unknown() 이 호출 됩니다.

.............. unknown[카피2]() 가 실행 됩니다.

..................... ch = getchar() 표현에 의해서 입력문자를 한개 받습니다.

..................... ch[카피2] 는 c의 아스키코드값 (99) 를 가지고 있습니다.

..................... ch 가 줄바꿈이 아닙니다. 계속합니다.

..................... unknown() 이 호출됩니다.

..................... unknown[카피3]() 이 실행 됩니다.

............................ ch = getchar() 표현에 의해서 입력문자를 한개 받습니다.

............................ ch[카피3] 은 줄바꿈 문자를 가지고 있습니다.

............................ ch 는 줄바꿈입니다. while 문을 빠져 나옵니다.

............................ ch[카피3] 을 출력합니다. - 줄이 바뀝니다.

............................ unknown[카피3] 이 끝납니다.

...................... ch[카피2] 를 출력합니다. - c를 출력합니다.

...................... unknown[카피2] 가 끝납니다.

.............. ch[카피1] 을 출력합니다. - b를 출력합니다.

.............. unknown[카피1] 이 끝납니다.

....... ch 를 출력합니다. - a 를 출력합니다.

....... unknown 이 끝납니다.

 

줄바꿈 cba 가 출력됩니다.