코딩 기록소
article thumbnail
반응형

문제

피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다.

이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가 된다.

n=17일때 까지 피보나치 수를 써보면 다음과 같다.

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597

n이 주어졌을 때, n번째 피보나치 수를 구하는 프로그램을 작성하시오.

 

입력

첫째 줄에 n이 주어진다. n은 20보다 작거나 같은 자연수 또는 0이다.

 

출력

첫째 줄에 n번째 피보나치 수를 출력한다.

 

예제 입력 예제 출력
10 55

 

정답

import sys

def fibo(num):
    if (num > 1):
        return fibo(num - 1) + fibo(num - 2)
    else:
        return num


if __name__ == '__main__':
    cnt = int(sys.stdin.readline().strip())
    results = fibo(cnt)
    print(results)

 

Tip

def fibo(num):
    if (num > 1):
        return fibo(num - 1) + fibo(num - 2)
    else:
        return num

재귀 함수를 통해서 피보나치의 수를 구했다.

 

재귀 함수란?

함수가 자기 자신을 호출하는 것을 일컫는 말이다.

위에 함수에는 fibo(num - 1)과 fibo(num - 2)를 통해서 자기 자신을 호출 하였다.

 

재귀 함수의 주의점

1. 재귀 함수는 반복문에 비해 메모리를 많이 차지 하기 때문에 성능적인 면에서는 많이 느리다.

재귀 함수를 호출 시 함수에 대한 정보가 스택 메모리에 저장하게 되고 LIFO에 의해 마지막에 들어온 순서대로 retrun을 하게 된다.

 

2. 재귀 함수는 탈출 하는 조건을 자세히 실수 없이 짜야 한다.

만약 호출 수 제한을 넘게 된다면 RecursionError: maximum recursion depth exceeded가 발생하게 된다.

2-1. 재귀 함수 호출 제한을 늘리고 싶다면 이 코드를 사용하자.

import sys

# 인자 값은 호출 수
sys.setrecursionlimit(10**6)

 

재귀 함수의 장점

1. 직관적인 코드와 가독성을 높인다.

 

메모이제이션

피보나치 수의 알고리즘을 생각해봤다면 한번쯤은 드는 의문일 수도 있다.

 

같은 함수를 반복해서 호출하기 때문에 메모리와 시간을 낭비하고 있다.

그래서 사용하는 기법 중 하나가 메모이제이션 기법이다.

실행시간을 위해 메모리를 좀 더 희생하는 기법으로 정해진 값이 있다면 그 값을 저장하고 나중에 호출하게 되면 저장했던 값을 내보내주는 것이다.

import sys

fibos = {1: 1, 2: 1}

def fibo(num):
    if num in fibos:
        return fibos[num]

    fibos[num] = fibo(num - 1) + fibo(num - 2)
    return fibos[num]


if __name__ == '__main__':
    cnt = int(sys.stdin.readline().strip())
    results = fibo(cnt)
    print(results)

좋은 기법이니 이해하거나 이런 게 있구나 정도를 생각하면 좋을 것이다.

반응형
profile

코딩 기록소

@seungyong20

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!