Recursion(재귀)

sihwan_e·2020년 10월 28일
0

백준 알고리즘 문제

목록 보기
17/18

재귀호출(순환호출)

함수 또는 메소드가 자기 자신을 또 호출하는 형태를 말한다.
파이썬은 무한 호출이 감지되면 중지시키는 RecursionError이 존재한다.
아무리 그렇다고해도 횟수를 정해놓거나, 함수가 종료될수있는 조건을 꼭 넣어두자.

팩토리얼이 좋은 예가 될수 있다.
팩토리얼은 어떠한 숫자를 1이 될 때 까지 1씩줄여가며 곱한 값을 나타낸다.
참고로 0! 은 1 이다.

def factorial(num):
	if num > 1:
    	return num * factorial(num-1)
    else:
    	return num
for num in range(10):
	print(factorial(num))
 >>>
 0
 1
 2
 6
 24
 120
 720
 5040
 40320
 362880

팩토리얼은 n-1번의 팩토리얼 함수를 호출하여 곱셈을 한다. 그러니 시간복잡도는 O(n)

이 재귀 호출은 스택의 전형적인 예이다.

피보나치 역시 좋은 예이다.
참고로 피보나치 수열은 이전 두개의 값을 합해서 그 다음 수를 만들어 나가는 수열이다.

def fibonacci(n):
	if n <= 1:
    	return 0
    elif n ==2:
		return 1
    else:
    	return fibonacci(n-2) + fibonacci(n-1)

하노이 타워

총 3개의 기둥이 있고, 첫번째 기둥에 작은 원판이 위에 있도록 순서대로 쌓여져있다. 첫번째라인의 탑들을 마지막 라인까지 동일한순서를 유지해서 옮기는 문제.
조건
1. 한 번에 하나의 원판만 옮길수 있다.
2. 큰 원판은 작은 원판위에 있을 수 없다.

작은 원판이 큰 원판 위에만 있으면 되니까 당연하지만 그 라인에서 가장 작은 원판만 움직일수가 있다.

# n(입력): 옮기려는 원반의 개수 
# from_pos :  옮길 원반이 현재 있는 출발점 기둥
# to_pos : 원반을 옮길 도착점 기둥
# aux_pos : 옮기는 과정에서 사용할 보조 기둥
def hanoi(n, from_pos, to_pos, aux_pos):
	
    if n == 1: 
    	print(from_post, '->', to_pos)
    	return
    
    hanoi(n-1, from_pos, aux_pos, to_pos)
    print(from_pos, '->', to_pos)
    
    hanoi(n-1, aux_pos, to_pos, from_pos)
print('n=1')
hanoi(1,1,3,2)
print('n=2')
hanoi(2,1,3,2)
    (by book "모두의 알고리즘 with 파이썬")

이런 느낌으로 이동시키면된다.

백준 10872

문제:
0보다 크거나 같은 정수 N이 주어진다. 이때, N! 을 출력하는 프로그램을 작성하시오.

num = int(input())
def factorial(num):
    if num <= 1:
        return 1
    else:
        return num * factorial(num - 1)
    

print(factorial(num))

68ms

백준 10870

문제:
피보나치수열 만드시오

num = int(input())

def fibonacci(num):
    if num <= 0:
        return 0
    elif num <= 1:
        return 1
    else:
        return fibonacci(num-1) + fibonacci(num-2)
print(fibonacci(num))

72ms

num = int(input())

def fibonacci(num):
    if num <= 1:
        return num
    
    else:
        return fibonacci(num-1) + fibonacci(num-2)
print(fibonacci(num))

68ms

profile
Sometimes you gotta run before you can walk.

0개의 댓글