Page 174 - Do it! 자료구조와 함께 배우는 알고리즘(C 언어, 3쇄)
P. 174

1과 2를 출력합니다. 이 작업을 recur(4)까지 쌓아 올려 설명한 내용이 그림 5-6입니다. 다음

                   과 같은 과정을 거치면 recur(4)가 출력됩니다.


                    recur(-1) : 아무것도 하지 않음
                    recur(0)  : 아무것도 하지 않음

                    recur(1)  : recur(0)  recur(-1)  ⇨ 
                    recur(2)  : recur(1)  recur(0)  ⇨ 
                    recur(3)  : recur(2)  recur(1)  ⇨ 
                    recur(4)  : recur(3)  recur(2)  ⇨ 

                                  [그림 5-6] recur 함수의 상향식 분석


                             Q4     오른쪽의 recur2 함수를 보고 하향식 분석과 상향식 분석을
                    연습                                                        void recur2(int n)
                    문제      수행해 보세요.                                          {
                                                                                if(n > 0) {
                                                                                  recur2(n - 2);
                                                                                  printf("%d\n", n);
                                                                                  recur2(n - 1);
                                                                                }
                                                                              }





                   재귀 알고리즘의 비재귀적 표현

                   recur 함수를 재귀 호출을 사용하지 않고 구현하는 방법에 대해 살펴보겠습니다.


                   꼬리 재귀의 제거
                   함수의 꼬리에서 재귀 호출하는 함수 recur(n – 2)라는 말은 ‘인자로 n – 2를 전달하여 recur

                   함수를 호출한다’는 의미입니다. 따라서 이 호출은 아래처럼 바꿀 수 있습니다.


                     n의 값을 n - 2로 업데이트하고 함수의 시작 지점으로 돌아갑니다.



                   실습 5-4는 이 방법을 그대로 구현한 프로그램입니다. recur 함수는 n의 값을 –2만큼 줄인
                   다음 goto문을 사용해 함수의 시작 지점으로 돌아갑니다.

                      goto문은 본문의 설명을 코드로 간단하게 표현하기 위해 사용한 문법입니다.









                   174   C 알고리즘
   169   170   171   172   173   174   175   176   177   178   179