C++ Chapter 7.10 : 재귀적 함수 호출

Date:     Updated:

카테고리:

태그:

인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 C++ 강의를 듣고 정리한 필기입니다. 😀
🌜 [홍정모의 따라 하며 배우는 C++]강의 들으러 가기!


chapter 7. 함수 : Recursion

재귀적 함수 호출 : 함수 내부에서 자기 자신을 호출하는 것. 종료 조건이 반드시 필요하다.

🔔 예제 1

#include <iostream>
using namespace std;

void countDown(int count)
{
   cout << count << endl;
   countDown(count - 1);  // 자기 자신을 호출 
}

int main()
{
   countDown(5);
   return 0;
}
  countdown(5) // count(4)를 호출
     countdown(4) // count(3)를 호출
        countdown(3) // count(2)를 호출
           countdown(2) // count(1)를 호출
              countdown(1) // count(0)를 호출
                 countdown(0) // count(-1)를 호출
                 ...   

이 예제 같은 경우에는 종료 조건이 없어서 무한으로 호출되고 있다. (마치 영화 <인셉션>에서 꿈에서 꿈으로 계속해서 들어가는 것과 비슷한 그림) 이 때문에 스택 메모리가 꽉차 생기는 스택 오버플로우 문제가 일어날 수 있다. 따라서 재귀적 함수 호출을 할 때는 꼭 똑같은 함수가 그만 호출되는 경우, 즉 종료 조건을 꼭 명시해주어야 한다.


🔔 예제 2

#include <iostream>
using namespace std;

void countDown(int count)
{
   cout << count << endl;
   if ( count > 0 )  // count <= 0 일 때 재귀적 호출을 종료된다.
      countDown( count - 1); // 자신이 자신을 호출
}

int main()
{
   countDown(5);
   return 0;
}
countdown(3) // 3출력 + count(2)를 호출 
    countdown(2) // 2출력 + count(1)를 호출
        countdown(1) // 1출력 + count(0)를 호출
            countdown(0) // 0출력 
                /* count > 0 에 해당하지 않아 재귀적 호출 종료 */   

if ( count > 0 ) 조건에 해당되지 않아 재귀적으로 함수를 호출하는 과정이 종료된다.


🔔 예제 3

#iclude <iostream>

using namespace std;

int sumTo( int sumnum)
{
   if (sumnum <= 0)
      return 0;
   else if (sumnum <= 1) 
     return 1;
   else
   {
      return sumTo(sumnum - 1) + sumnum;
   }
}

int main()
{
   cout << sumTo(10) << endl;
   return 0;
}

이 경우엔 재귀적 함수 호출 종료 조건이 두 개다. sumnum이 0이 되는 경우와 sumnum이 1이 되는 경우.

재귀적 함수 호출이 종료되면서 단계적으로 함수를 호출했던 곳으로 돌아온다

return sumTo(sumnum - 1) + sumnum; sumTo(sumnum - 1)의 최종 리턴값을 가지고 다시 돌아온다.

sumTo(5) // sumTo(4)호출
    sumTo(4) // sumTo(3)호출
        sumTo(3) // sumTo(2)호출
            sumTo(2) // sumTo(1)호출
                sumTo(1) // (sumnum <= 1 에 해당되어 더이상 재귀 호출 X)
                return 1
            return 1 + 2
        return 1 + 2 + 3
    return 1 + 2 + 3 + 4
return 1 + 2 + 3 + 4 + 5     


🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

댓글남기기