문제 : 0~40의 범위를 가지는 입력을 받는다. 피보나치 수열의 n번째 값인 F(n)을 구하여라.
반복문과 재귀를 이용해 각각 구현하고 두 함수의 실행시간을 출력해 비교하라.
#include <iostream>
#include <time.h>
using namespace std;
class Fibonacci {
private:
int* L;
public:
Fibonacci(int n) {
L = (int*)malloc(sizeof(int) * (n + 1));
}//생성자
int iterFibo(int n) {
while (n > 0) {
if (n > 40 || n < 0) {
return 0;
}
for (int i = 0; i < n + 1; i++) {
if (i <= 1) { L[i] = 1; } //1 1 2 3 5 F(3) = 2
else { L[i] = L[i - 1] + L[i - 2]; }
}
return 0;
}
return 0;
}
int recurFibo(int n) {
if (n < 0 || n > 40) {
std::printf("wrong range\n");
return 0;
}
else if (n <= 1) { n = 1; }
else {
n = recurFibo(n - 1) + recurFibo(n - 2);
}
return 0;
}
int* getL() const {
return L;
}
};
int main() {
int n = 0; clock_t start, finish; double elapsed;
scanf_s("%d", &n);
while ( n >= 0 && n <= 40 ) { //while True
Fibonacci f(n);
start = clock();
f.iterFibo(n);
finish = clock();
elapsed = ((double)(finish)-(double)(start)) / CLOCKS_PER_SEC;
std::printf("Iterative: %d ", f.getL()[n - 1]);
std::printf("(%f", elapsed * 1000.0);
std::printf("%s", "ms)\n");
start = clock();
f.recurFibo(n);
finish = clock();
elapsed = ((double)(finish)-(double)(start)) / CLOCKS_PER_SEC;
std::printf("Recursive: %d ", f.getL()[n - 1]);
std::printf("(%f", elapsed * 1000.0);
std::printf("%s", "ms)\n");
scanf_s("%d", &n);
}
}
재귀함수에 clock을 넣을 수 없어 main 함수에서 시간을 측정하였다.