앎을 경계하기

Programming/Algorithm

백준 #1003 - 피보나치 함수 c++

양갱맨 2019. 2. 7. 02:38

< 문제 >

다음 소스는 N번째 피보나치 수를 구하는 C++ 함수이다.

1
2
3
4
5
6
7
8
9
10
11
int fibonacci(int n) {
    if (n == 0) {
        printf("0");
        return 0;
    } else if (n == 1) {
        printf("1");
        return 1;
    } else {
        return fibonacci(n‐1) + fibonacci(n‐2);
    }
}

fibonacci(3)을 호출하면 다음과 같은 일이 일어난다.

  • fibonacci(3) fibonacci(2) fibonacci(1) (첫 번째 호출)을 호출한다.
  • fibonacci(2) fibonacci(1) (두 번째 호출)과 fibonacci(0)을 호출한다.
  • 두 번째 호출한 fibonacci(1)은 1을 출력하고 1을 리턴한다.
  • fibonacci(0)은 0을 출력하고, 0을 리턴한다.
  • fibonacci(2) fibonacci(1) fibonacci(0)의 결과를 얻고, 1을 리턴한다.
  • 첫 번째 호출한 fibonacci(1)은 1을 출력하고, 1을 리턴한다.
  • fibonacci(3) fibonacci(2) fibonacci(1)의 결과를 얻고, 2를 리턴한다.

1은 2번 출력되고, 0은 1번 출력된다. N이 주어졌을 때, fibonacci(N)을 호출했을 때, 0과 1이 각각 몇 번 출력되는지 구하는 프로그램을 작성하시오.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>
#include <vector>
using namespace std;
 
vector<vector<int>> oz;
 
vector<vector<int>> fibonacci(int n, vector<vector<int>>&oz) {
    if (oz[n][0!= 0 || oz[n][1!= 0) {
        return oz;
    }
    if (n == 0) {
        oz[n][n]++;
        return oz;
    }
    if (n == 1) {
        oz[n][n]++;
        return oz;
    }
    else {
        fibonacci(n - 1, oz);
        fibonacci(n - 2, oz);
        oz[n][0+= oz[n - 1][0];
        oz[n][1+= oz[n - 1][1];
        oz[n][0+= oz[n - 2][0];
        oz[n][1+= oz[n - 2][1];
        return oz;
    }
}
 
int main() {
    
    int T;
    cin >> T;
    for (int i = 0; i < T; i++) {
        int n;
        cin >> n;
        oz.assign(n + 1vector<int>(20));
 
        fibonacci(n, oz);
        cout << oz[n][0<< " " << oz[n][1<< endl;
    }
    return 0;
}
cs



2019/02/07 - [Study/Algorithm] - 백준 #9461 - 파도반수열 python