생성일: 2021년 11월 7일 오후 5:18
Recursion(재귀) = Loop
재귀와 반복문은 같은 것
재귀는 사실 반복문에 비해 비효율 적이지만 코드를 간결하고 가독성 있게 작성할 수 있다는 장점이 있다.
팩토리얼(factorial), 조합(combinations), Power, Sort 등 다양한 함수를 재귀적으로 구현 가능
위의 형태에서 재귀를 사용하지 않고 마지막 아이템부터 출력을 하는 함수를 구현한다면 계속해서 반복문을 통해 출력하고 하는 아이템까지 접근을 해야한다.
하지만 재귀를 사용하면 마지막 아이템까지 한번 접근을 한뒤 return하면서 출력을 하고 차례대로 올라오면 된다.
insert 함수 작동 원리
Delete 함수 작동원리
각 함수의 주소를 return address에 저장하여 return 될 때 찾아갈 주소를 확보해 둔다.
이 것을 run-time stack에 저장하고 이 stack을 activation record에 배치한다.
위와 같이 스택에 Return Address와 local variable들을 저장한고 반납하면서 return된다.
여기서 Return Address인 100은 Func함수를 호출한 Main함수의 주소이다.
template <class ItemType>
void SortedType<ItemType>::RevPrint(NodeType<ItemType>* listPtr)
{
if (listPtr == NULL) //base case
return;
else //general case
{
RevPrint(listPtr->next);
std::cout << listPtr->info << std::endl;
}
}
위와 같은 역출력 함수 (listPtr은 listData를 가리킨다고 가정) 를 반복문으로 구현한다면 cout해야할 listPtr→info를 어딘가에 저장해두어야 한다 ⇒ Stack 사용#include "StackType.h"
void SortedType<ItemType>::RevPrint()
{
StackType<NodeType> stack;
NodeType* listPtr;
listPtr = listData;
while(listPtr != NULL)
{
stack.push(listPtr); //Stack에 저장
listPtr = listPtr->next;
}
while(!stack.IsEmpty()) //Stack에 저장된 item을 차례대로 출력
{
listPtr = stack.Top();
stack.Pop();
cout<< listPtr->info <<endl;
}
}
반복문으로 구현하면 위와 같다.Shallow Depth
Efficiency
Clarity
위의 조건을 만족할 때 재귀를 사용하는 것이 바람직하다.