https://www.acmicpc.net/problem/10870
[문제]
피보나치 수는 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번째 피보나치 수를 출력한다.
[예제 입력1]
10
[예제 출력1]
55
나의 풀이
def fibonacci(num):
if num == 0:
return 0
elif num == 1 or num == 2:
return 1
else:
return fibonacci(num-1) + fibonacci(num-2)
num = int(input())
print(fibonacci(num))
피보나치 수열이란?
피보나치수열은 첫째 및 둘째 항이 1이며, 그 뒤의 모든 항은 바로 앞 두 항의 합인 수열이다.
편의상 0번째 항을 0으로 두기도 한다.
그래서 피보나치 수를 0번째 항부터 시작할 경우 처음 몇 항은 다음과 같다
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987....
피보나치 수열을 구하는 방법
ㅇ 함수를 사용한 방식
def fibonacci(num):
x = y = 1
if num == 0:
return 0
elif num == 1 or num == 2:
return 1
for i in range(1, num):
x = y
y = x+y
return x
print([fibonacci(num) for num in range(1, 10)])
[결과]
[1, 1, 2, 3, 5, 8, 13, 21, 34]
ㅇ 재귀 함수(Recursive)를 사용한 방식
def fibonacci(num):
if num == 0:
return 0
elif num == 1 or num == 2:
return 1
else:
return fibonacci(num-1) + fibonacci(num-2)
print(fibonacci(10))
[결과]
55
ㅇ 람다를 사용한 방식
fib = lambda n: 1 if n<=2 else fib(n-1) + fib(n-2)
print(fib(10))
[결과]
55
---------------------------------------------------
fib = lambda n, a=0, b=1 : a if n<=0 else fib(n-1,b, a+b)
print(fib(10))
[결과]
55
람다를 사용한 방식은 한 줄 코딩을 할 때 자주 사용한다고 합니다. (아직 내 머리로 이해하기에는 벅찬..)
'문제풀이' 카테고리의 다른 글
[백준] 1159번 파이썬 풀이 (0) | 2022.03.23 |
---|---|
[백준] 1267번 파이썬 풀이 (0) | 2022.03.23 |
[백준] 1100번 파이썬 풀이 (0) | 2022.03.20 |
[백준] 1009번 파이썬 풀이 (0) | 2022.03.20 |
[백준] 1076번 파이썬 풀이 (0) | 2022.03.16 |