Computer Science/Data Structure w. Python

재귀와 귀납적 사고

sekimm 2024. 2. 13. 21:00

어떤 문제나 함수 등이 자신과 성격이 똑같지만 크기가 더 작은 문제를 하나 이상 포함하고 있을 때 재귀적 구조를 갖고 있다고 말한다. 

 

재귀 구조 예시

수열

 

등차 수열

seq(n):
	if n = 1:
		return 1
	else:
		return seq(n-1) + 5

※반복해서 호출하는 재귀 알고리즘은 끝나기 위해서 반드시 경계 조건을 가지고 있어야한다. 위 알고리즘에서는 if n = 1이 경계조건이다. 

 

피보나치 수열

fib(n):
	if n=1 or n=2:
		return 1
	else:
		return fib(n-1) + fib(n-2)

※재귀 알고리즘의 사용은 문제를 해결하는데 유용할 수 있지만, 잘못 쓰면 치명적일 수 있다. 위에 예시에서 n이 커질수록 걸리는 시간이 매우 증가하게 된다. 이는 한번 계산했던 결과들을 다시 사용하지 못하고, 계속 호출하는 중복을 일으키기 때문이다. 

 

하노이 탑

a,b,c 3개의 기둥이 있고, 기둥 a에 넓이가 서로 다른 n개의 원반이 있을 때, 특정 규칙을 만족하면서 n개의 원반을 기둥 b로 옮기는 문제이다.

  • 규칙
    • 원반은 한 번에 하나씩 옮길 수 있다.
    • 큰 원반이 작은 원반 아래에 놓여 있어야 한다.
  • 알고리즘
    • 맨 아래 원반을 제외한 n-1개의 원반을 기둥 c로 옮긴다.
    • a에 있는 원반을 b로 옮긴다.
    • c에 있는 n-1개의 원반을 b로 옮긴다. 
move(n,a,b,c):
	if(n>0):
		move(n-1, a, c, b)
		a -> b
		move(n-1, c, b, a)