함수 응용2 : 재귀함수, 문자/문자열처리함수, 유틸리티함수
* 매개변수 전달 방법
- Call by value
- Call by reference ---> 포인터
* 스택 프레임 그리는 방법 ---> 중요
-------------------------------------------------- 함수 응용1
* 재귀호출
- 재귀호출을 이용한 문자열 출력
- 재귀호출의 장/단점
* 문자/문자열 처리 함수
- 문자 처리 함수
- 문자열 처리 함수
- 유니코드 문자열
* 유틸리티 함수
- atoi, atol, atof
- time, localtime, ctime
- srand, rand
- system, exit
-------------------------------------------------- 함수 응용2
* 재귀호출
- 함수가 함수를 호출하고, 그 함수는 또 다른 함수를 호출하고... --> callstack
- stack은 위로 쌓아 올린다...
- stack 구조는 어느경우에 적당한가
. 가장 최근의 일을 가장 위로...
. 함수 call -> call -> call .. 반환.. 반환 ... 반환 ... stack의 구조가 좋아...
ex) 반복문을 이용한 5 팩토리얼 계산
#include <stdio.h>
int main(void)
{
int i=0, nFact=1;
for(i=5;i>=1;--i)
nFact=nFact*i;
printf("5! == %d\n",nFact);
return 0;
}
-----------------------------
결과) 5! == 120
ex) 재귀호출을 이용한 5 팩토리얼 계산
#include <stdio.h>
int GetFactorial(int nParam)
{
int nResult=0;
if(nParam==1) return 1;
nResult=nParam*GetFactorial(nParam -1);
return nResult;
}
int main(void)
{
printf("5! == %d\n", GetFactorial(5));
return 0;
}
-----------------------------
결과) 5! == 120
ex)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void PutData(char *pszParam)
{
if(*pszParam=='\0')
return;
putchar(*pszParam); // 찍고
PutData(pszParam + 1); // 또 호출하고 --> 윗줄 아랫줄 순서를 바꾸면 호출된 함수를 빠져나가면서(반환) TestData의 역순으로,
} // 즉, ataDtseT 순으로 찍게된다.
// 스택은 가장 먼저 push한 정보가 가장 나중에 pop(LIFO) 구조임. 엑셀/워드의 undo(ctrl+z) 와 유사..
int main(void)
{
PutData("TestData");
putchar('\n');
return 0;
}
---------------------------------
결과) TestData
재귀호출의 단점
stack의 크기가 1MB정도이므로 스택 메모리를 순식간에 대량으로 소모할 가능성이 있다. -- stack overflow
이러한 이유로 사용할 때는 신중을 기해야 함.
반복문으로 가능하다면 반복문을 쓰는게 맞다. 그러나 비선형 자료구조인 트리를 다룰때는 대부분 재귀호출을 사용하고, 그게 맞다. (17:36')
* 문자열 처리 함수
문자열 상수? ... 상수X
... 상수화된 문자 배열O