백준 온라인 저지 | 10870번 피보나치 수5 | C++
10870번: 피보나치 수 5
피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다. 이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가
www.acmicpc.net
1. 문제 접근
수학에서 피보나치(fibonacci) 수는 첫째 항과 둘째 항이 1이고 그 이후의 모든 항은 바로 앞 두 항의 합인 수열이다. 피보나치 수 Fn의 초항은 F(1) = F(2) = 1이고, 점화식은 F(n) = F(n-1) + F(n-2) (n ≥ 2)으로 나타낼 수 있다. 예를 들어 F(4)는 F(3) + F(2) = F(1) + F(2) + F(2) = 1 + 1 + 1 = 3이다. 재귀 문제를 풀 때 생각해야 할 함수 인자, 기본 조건, 그리고 재귀 조건을 살펴보자.
■ 1.1 함수 인자
피보나치 수의 점화식 F(n) = F(n-1) + F(n-2) (n ≥ 2)을 보면 피보나치를 계산하기 위해서 필요한 숫자는 양의 정수 N임을 알 수 있다. 그러므로 재귀 함수에 전달할 인자는 사용자가 입력할 양의 정수 N이다.
■ 1.2 기본 조건
피보나치 수는 점화식의 초항이 주어져 있다. 초항 F(1)과 F(2)가 1로 주어져 있으므로 팩토리얼의 기본 조건은 n이 1과 2일 때 1을 반환하도록 구현해야 한다.
■ 1.3 재귀 조건
피보나치 수의 점화식 F(n) = F(n-1) + F(n-2) (n ≥ 2)은 양의 정수 n에서 각각 1과 2만큼 감소시킨 값을 재귀 함수의 인자로 전달하여 호출하고, 각 재귀 함수에서 반환된 값을 더하는 방식으로 구현할 수 있다.
2. 문제 풀이
- 재귀 함수 fibonacci를 정의한다.
- 매개 변수로 전달할 인자는 사용자가 입력한 양의 정수인 n이다.
- 기본 조건을 구현한다.
- n이 1 또는 2인 경우, 1을 반환한다.
- 재귀 조건을 구현한다.
- n이 1 또는 2가 아닌 경우, n - 1, n - 2를 인자로 각각 전달한 재귀 함수를 호출한다.
- 두 재귀 함수에서 반환된 값을 더해 반환한다.
3. 문제 해결
#include <iostream>
using namespace std;
int fibonacci(int n);
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0);
int N;
cin >> N;
cout << fibonacci(N) << '\n';
return 0;
}
int fibonacci(int n) {
// 기본 조건입니다. 0번째, 1번째 피보나치 수는 각각 0, 1입니다.
if (n == 0 || n == 1) {
return n;
}
// 재귀 조건입니다. Fn = Fn-1 + Fn-2 (n >= 2)입니다.
else {
return fibonacci(n - 1) + fibonacci(n - 2);
}
}
4. 문제 고찰
피보나치 수도 팩토리얼과 마찬가지로 기본적인 재귀 함수 문제이다. 점화식과 초항이 주어져 있어서 문제를 파악하는 게 훨씬 쉬웠다.
'Data Structures and Algorithms > 백준 온라인 저지' 카테고리의 다른 글
백준 온라인 저지 | 2630번 색종이 만들기 | C++ (0) | 2022.08.04 |
---|---|
백준 온라인 저지 | 10872번 팩토리얼 | C++ (0) | 2022.08.04 |
백준 온라인 저지 | 10825번 국영수 | C++ (0) | 2022.07.24 |
백준 온라인 저지 | 2178번 미로 탐색 | C++ (0) | 2022.03.08 |
백준 온라인 저지 | 1926번 그림 | C++ (0) | 2022.03.08 |
댓글