목적
  - 재귀 호출을 이해한다.

문제
사용자 삽입 이미지

코드

#include <iostream>

using namespace std;

void print_3(int aIn)
{
 if(aIn < 1)
  return;

 else
 {
  if(aIn % 3 == 0)
  {
   cout << aIn << " ";
   print_3(--aIn);
  }

  else
  {
   print_3(--aIn);
  }
 }

 return;
}

int main(void)
{
 print_3(50);
 cout << endl;
 return 0;
}

해설
  - aIn < 1 조건을 한 이유는 --aIn 이후 1에서 --aIn 을 하면 0 이 출력되기 때문입니다.
  - 재귀 호출은 효율적이면서도 위험한 결과를 얻을수 있는 코딩입니다. 예전 문제들을 잘 보시기 바랍니다.
  - 배수 구하는건 나머지가 0인 원리를 이용해서 구하면 쉽게 얻을수 있습니다.

참고
  - 유사 문제

Posted by 카켈



목적
  - 재귀 호출을 익힌다.

문제

사용자 삽입 이미지

코드
#include <iostream>

using namespace std;

void v_Printfact(int);

void v_Printfact(int iIn)
{
 if(iIn > 20)
 {}

 else
 {
  cout << iIn << " ";
  v_Printfact(iIn + 1);

 }
 
 return;
}


int main(void)
{
 int iIn = 10;
 v_Printfact(iIn);
 cout << '\n';

 return 0;
}

해설
  - 20까지 숫자를 출력 1을 더한 인수를 넣어 다시 실행, 그 이상은 리턴하여 실행하지 않습니다.

참고
  - 유사 문제

Posted by 카켈




목적
  - 강제 대입을 재귀 호출에 응용시켜 본다.

문제

사용자 삽입 이미지
코드

#include <iostream>
#include <cmath>

using namespace std;

void do_5_equation(int aIn)
{
 if(pow(aIn, 5) - 5 * pow(aIn, 4) - 15 * pow(aIn, 3) + 85 * pow(aIn, 2) - 26 * aIn - 120 == 0)
  cout << aIn << " ";

 if(aIn > 10) return;
 do_5_equation(aIn + 1);
 return;

}

int main(void)
{
 cout << "주어진 오차방정식의 근 : ";
 do_5_equation(-10);
 cout << endl;

 return 0;
}


해설
  -  재귀호출시 중요한 점은 return 시 호출시의 다음 문장으로 돌아 간다는 것입니다.
  -  따라서 -10 -9 -8 ... 8 9 10
                           9
                         8
                       7
                   ...
               -9
           -10

    형태로 aIn 값이 변합니다.
    이는 스택(통)형으로 수행후 돌아갈 다음 문장 주소를 쌓아 놓았기 때문입니다.

참고
  - 재귀 호출 유사 문제
  - 유사 문제

Posted by 카켈



목적
  - 재귀 호출을 실제 수학에 응용한다.

문제

사용자 삽입 이미지
코드

#include <iostream>

using namespace std;

long l_Cumulative(unsigned int uiIn)
{ return uiIn + ( uiIn > 0 ? l_Cumulative(uiIn - 1) : 0); }

double l_Factorial(unsigned int uiIn)
{ return uiIn * ( uiIn > 2 ? l_Factorial(uiIn - 1) : 1); }


int main(void)
{
 unsigned int uiIn;
 cout << "양의 정수 값을 입력하세요 : ";
 cin >> uiIn;

 cout << "1부터 " << uiIn << " 까지의 누적합 : " << l_Cumulative(uiIn) << endl ;
 cout << "1부터 " << uiIn << " 까지의 누적곱 : " << l_Factorial(uiIn) << endl ;

 return 0;
}


해설
  - 삼항 연산자로 판정을 간단하게 해서 누적 합/ 곱을 출력했습니다.
  - 누적 곱(factorial) 인 경우 값이 엄청 크기 때문에 double 형으로 했습니다. 그래도 안되는 경우가 많기 때문에 더 큰 수를 받아 들이는 알고리듬이 따로 존재 합니다.

참고
  - 재귀 호출 관련 문제

Posted by 카켈



목적
  - 재귀 호출(Recursive call)을 익힌다.
문제
사용자 삽입 이미지
풀이

#include <iostream>

using namespace std;

long l_Recursive(long aIn)
{ return aIn + (aIn < 456 ? l_Recursive(aIn + 1) : 0); }

int main(void)
{ cout << "123부터 456 까지의 합 : " << l_Recursive(123) << endl; return 0; }

해설
  - 재귀 호출은 그 원리를 이해하면 정말 효율적인 코딩이 가능합니다.
  - 자기 자신을 계속 호출하되 리턴 값이 계속 누적 되기 때문에 무한 반복에서 빠져 나갈수 있는 조건만 갖추면 원하는 범위 내에서 계속 연산을 할수 있습니다.

  - 이 경우 455 전 까지만 계속 다음 숫자를 호출 합니다. 123 에서 시작하라고 하니 결국은

123 + l_Resursive(124)
123 + 124 + l_Resursive(125)
... (계속 반복)
123 + 124 + 125 + 126 + ... l_Resursive(454)
123 + 124 + 125 + 126 + ... 455 + l_Resursive(455)
123 + 124 + 125 + 126 + ... 456 + 0

이렇게 되어 원하는 값인 123 + 124 + ... + 455 + 456 = 96693 이렇게 됩니다.

  - 스택 방식으로 되어 있기 때문에 시스템 프로그래밍 공부 하시는 분들에게 유익한 함수 입니다. 나중에 어셈블러 공부 하실일 있으면 미리 익혀 두시면 참 도움이 될 겁니다.

참고

  - http://www.winapi.co.kr/clec/cpp2/16-2-1.htm : 재귀호출


Posted by 카켈
이전페이지 1 다음페이지