[ 재귀적 함수 ]

 

재귀함수란 “자기 자신을 재참조하는 함수”이기 때문에 본인이 본인을 호출하는 구조로 되어있다.

 

한번 보자

 

[코드]

 

 

[결과]


 

 

남들은 보니 팩토리얼을 예제로 많이 사용했네요

팩토리얼은 그냥 공식만

 

n!=n×(n-1)!의 성질에서 n이 1일 때 1=1×0! 이 되므로 0!=1로 약속한다. 

 

 int factorial( int num )
{
if ( num <= 1 )  
return 1; 

else

{        // 재귀 호출-> num이 5라면 5, 4, 3, 2, 1들어가서 곱해지면서 리턴 1* 2* 3* 4* 5

return num * factorial( num - 1 );

}

}

 

 

 재귀함수는 무한루프에 빠지지 않도록 주의를 기울여야한다.

간단 코드니 여기서 무한루프 빠져도 금방 눈에 보이지만, 프로젝트가 커지면 디버깅도 힘들고

스트레스로 인해 머리털이 빠지는 현상이 일어 날지 모른다.

 

생각하며 코딩하자

 

 

[ 가변 인자 함수 ]

 

printf() 함수를 보면 신기한것이 있습니다.

 

함수원형은 stdio.h 파일에 포함되어있습니다. 자 그럼 함수 원형을 보죠.

 _Check_return_opt_ _CRTIMP int __cdecl printf(_In_z_ _Printf_format_string_ const char * _Format, ...);

 

printf( const char * _Format, ...);

문자열을 받는건 알겠는데, ... 이건 멀까요?

 

"..."  

 

이것이 가변인자(Variable argument function)을 나타내는 것이다

 

자 그럼 우리도 함수 하나 만들어 봅시다.

 

[코드]

 

 

[결과]


 

간단하게 구현해봤다.

우선 몇개의 매개변수를 전달할지의 int cnt를 두고 가변인자를 둬서

 

printf( 3, a, b, c ); //4byte 씩 차례대로 할당이 되므로

 

포인터 연산하여 매개변수 갯수에 맞게 출력하게 끔 구현되었다. 

 

 

 

─────────────────────────────────────────────

이제 좀 함수들을 이용해서

va_list, va_start(), va_end(), vsprintf() 매크로 함수를 써서 printf 함수를 만들어 보자.

 

[코드]

 

 

간단하게 함수 설명

 

va_start() 함수를 통해 가변인자 포인터변수 ap를 _vFormat_, 다음에 오는 매개변수 위치에 이동시켜고, vsprintf(); 문자열을 조립하여 pszlog에 저장합니다. va_end(); ap를 해제합니다.

 

 

[결과]


 

가변인자의 첫번째 매개변수는 전달될 매개변수의 갯수와 타입를 정하는데 사용한다. 

ex. "%d. Hello World %s\n " int, char* 총 2개가 전달된다.

 

 

그다지 어려운 부분은 없다. MSDN 에 깊은 설명이 있으니 참고

 

가변인자는 왜 쓰고, 언제 쓸까?

"인자의 갯수가 정해지지않았을때, 인자의 자료형이 정해지지 않았을때"

+ Recent posts