• toc {:toc}

What is Recursion?

  • ์žฌ๊ท€(Recursion) : ํ•จ์ˆ˜ ์•ˆ์—์„œ ์ž๊ธฐ ํ•จ์ˆ˜๋ฅผ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ์‹์„ ํ•œ๋‹ค.

    • ์ง์ ‘์  : ์ž๊ธฐ ์ž์‹ ์„ ์ง์ ‘ ๋ถ€๋ฅด๋Š” ์žฌ๊ท€์  ๊ตฌ์กฐ
    • ๊ฐ„์ ‘์  : ๋‘ ํ•จ์ˆ˜ ์ด์ƒ์ด ์—ฐ๊ฒฐ๋˜์–ด ์„œ๋กœ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์žฌ๊ท€์ ์ธ ๊ตฌ์กฐ
  • ํ•จ์ˆ˜๋Š” ํ˜ธ์ถœ ์‹œ ๋ฉ”๋ชจ๋ฆฌ์˜ ์Šคํƒ ๋ถ€๋ถ„์— ์œ„์น˜ํ•œ๋‹ค.

  • ์žฌ๊ท€๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜๋ณต๋˜์–ด ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— Stack overflow๋ฅผ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

  • ์žฌ๊ท€๋Š” ๋ฐ˜๋ณต๋ณด๋‹ค ํšจ์œจ์ ์ด์ง€ ์•Š์€ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์ง€๋งŒ, ๊ฐ„๋‹จํ•˜๊ณ  ์ฝ”๋“œ๊ฐ€ ์ง๊ด€์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•œ๋‹ค.

Structure of Recursion

  • Base case : ๋น„์žฌ๊ท€์ ์ธ ์ƒํƒœ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒฝ์šฐ์ด๋‹ค. ์žฌ๊ท€์˜ ์ข…๋ฃŒ, ๋ฐ˜ํ™˜ ์กฐ๊ฑด์ด ๋œ๋‹ค.
  • General (recursive) case : ์ž๊ธฐ ์ž์‹ ์˜ ๋” ์ž‘์€ ๋ฒ„์ „์œผ๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ์กฐ๊ฑด์ด๋‹ค.
  • ์žฌ๊ท€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ฐ˜๋ณต์ ์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ• ์ˆ˜๋ก ๋ฌธ์ œ๊ฐ€ ๋” ์ž‘์•„์ง€๋Š” ๊ตฌ์กฐ๋กœ ํ‘œํ˜„๋˜์–ด์•ผ ํ•œ๋‹ค.
int Factorial(int number){
	if (number == 0)
		return 1;
	else
		return number * Factorial(number-1);
}
// ์‹œ๊ฐ„ ๋ณต์žก๋„ : O(N)
  • ํŒŒ์Šค์นผ์˜ ๊ณต์‹์„ ์‚ฌ์šฉํ•ด์„œ ์กฐํ•ฉ๋„ ์žฌ๊ท€์ ์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
int Combinations(int n, int k){
	if (k==1)
		return n;
	else if (n==k)
		return 1;
	else
		return Combination(n-1, k) + Combination(n-1, k-1);
}
template<class ItemType>
bool BinarySearch(ItemType)(ItemType info[], ItemType item,
							int fromLoc, int toLoc){
	int mid;
	if (fromLoc > toLoc)
		return false;
	else{
		mid = (fromLoc + toLoc) / 2;
		if (info[mid] == item)
			return true;
		else if (item < info[mid])
			return BinarySearch(info, item, fromLoc, mid-1);
		else
			return BinarySearch(info, item, mid+1, toLoc);
	}
}
  • Sorted List์˜ ์žฌ๊ท€์  InsertItem
template <class ItemType>
void Insert(NodeType<ItemType>* &location, ItemType item){
	if ((location==NULL) || (item < location->info)){
		NodeType<ItemType>* tempPtr = location;
		location = new NodeType<ItemType>;
		location->info = item;
		location->next = tempPtr;
	}
	else
		Insert(location->next, newItem);
}
 
template <class ItemType>
void SortedType<ItemType>::InsertItem(ItemType newItem){
	Insert(listData, newItem);
}
  • InsertItem์„ ํ•˜๋ฉด ์ด์ „ ํฌ์ธํ„ฐ์˜ ๋‹ค์Œ ๊ฐ’์ด insert item, insert item์˜ ๋‹ค์Œ ๊ฐ’์„ ํ˜„์žฌ ๊ฐ’์œผ๋กœ ์ง€์ •ํ•ด์ค˜์•ผ ํ•œ๋‹ค. ์ฆ‰, 2๋ฒˆ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค.
  • ํ•˜์ง€๋งŒ ์œ„์˜ ๊ฒฝ์šฐ, locationโ†’next = tempPtr ๋ฅผ ํ†ตํ•ด ํฌ์ธํ„ฐ ํ•˜๋‚˜๋งŒ ๋ณ€๊ฒฝํ•ด์ค€๋‹ค. ์™œ ๊ทธ๋Ÿด๊นŒ?
    • &location โ†’ ํฌ์ธํ„ฐ์˜ ์ฃผ์†Œ๋ฅผ ๋งํ•œ๋‹ค.
  • locationโ†’next๊ฐ€ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋“ค์–ด๊ฐ€๊ณ , locationโ†’next์— new๋กœ ๋™์ ํ• ๋‹น์„ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ๋กœ ์ƒ๊ธด ๋…ธ๋“œ๊ฐ€ new, new์˜ ์ด์ „ ๋…ธ๋“œ๊ฐ€ prev๋ผ๋ฉด prevโ†’next๊ฐ€ ์ด๋ฏธ new๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๊ฒŒ ๋œ๋‹ค.
template <class ItemType>
void Delete(NodeType<ItemType>* &location, ItemType item){
	if(item == location->info)) {
		NodeType<ItemType>* tempPtr = location;
		location = location->next;
		delete tempPtr;
	}
	else
		Delete(location->next, item);
}
 
template <class ItemType>
void SortedType<ItemType>::DeleteItem(ItemType item){
	Delete(listData, item);
}
  • Tail Recursion : ํ•จ์ˆ˜์˜ ๋งˆ์ง€๋ง‰ ์ค„์— ์žฌ๊ท€ ํ˜ธ์ถœ์ด ํฌํ•จ๋œ ๊ตฌ์กฐ
  • Tail Recursion์€ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ์‰ฝ๊ฒŒ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์žฌ๊ท€ ํ˜ธ์ถœ์€ ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ์ €์žฅํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— activation record๋กœ ์ง€๋‹ˆ๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ Tail Recursion์€ ๋งจ ๋งˆ์ง€๋ง‰์— ์žฌ๊ท€ ํ˜ธ์ถœ์„ ํ•˜๊ณ  ๊ทธ ์ดํ›„ ๋™์ž‘์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ์ €์žฅํ•  ํ•„์š”๊ฐ€ ์—†์–ด ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ ์‰ฝ๋‹ค.
  • Tail Recursion์€ ํ•˜๋‚˜์˜ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

Recursion vs. Iteration

  • ๋ฐ˜๋ณต๋ฌธ : looping ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

  • ์žฌ๊ท€๋ฌธ : branching ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

  • ์žฌ๊ท€๋Š” ์‹œ๊ฐ„, ๊ณต๊ฐ„ ์ธก๋ฉด์—์„œ ๋ฐ˜๋ณต๋ฌธ๋ณด๋‹ค ๋น„ํšจ์œจ์ ์ด๋‹ค.

  • ํ•˜์ง€๋งŒ ๋ฌธ์ œ๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ, ์ง๊ด€์ ์œผ๋กœ ํ’€ ์ˆ˜ ์žˆ๊ณ  ์ฝ”๋“œ๋ฅผ ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.

  • Combination๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ ์ค‘๋ณต๋˜๋Š” ๊ณ„์‚ฐ์ด ๋งŽ์ด ๋ฐœ์ƒํ•˜๋Š”๋ฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ ์ค‘๋ณต๊ฐ’์„ ์ €์žฅํ•ด ์‚ฌ์šฉํ•˜๋Š” memoization ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ์ค‘๋ณต์„ ์ค„์ธ๋‹ค.

  • ์žฌ๊ท€์˜ ์‚ฌ์šฉ ์‹œ์ 

  • ์žฌ๊ท€ ํ˜ธ์ถœ์˜ ๊นŠ์ด๊ฐ€ ๋ฌธ์ œ์˜ ํฌ๊ธฐ์— ๋น„ํ•ด ์ƒ๋Œ€์ ์œผ๋กœ ์–•์„ ๊ฒฝ์šฐ

  • ์žฌ๊ท€๊ฐ€ ๋น„์žฌ๊ท€์  ๋ฐฉ์‹๊ณผ ๋น„์Šทํ•œ ๋ณต์žก๋„๋ฅผ ๊ฐ€์งˆ ๊ฒฝ

  • ์žฌ๊ท€๊ฐ€ ๋น„์žฌ๊ท€์  ๋ฐฉ์‹๋ณด๋‹ค ๋” ์งง๊ณ  ๊ฐ„๋‹จํ•œ ๊ฒฝ์šฐ