TLE 관련 질문드립니다.

okkdy0628 Reply 4 years 26 weeks ago
Overflow를 따져보기도 전에 TLE가 나와버렸습니다... 재귀함수를 최대한 이용해보려고 했으나 부족했던 것일까요? Discuss에 TLE 관련 내용이 올라와 있던데, 반드시 그렇게 풀어야만 하나요..?
withcs2 Reply 4 years 26 weeks ago
피보나치 함수를 재귀함수로 만들면 1. fib(n) = fib(n-1) + fib(n-2) 2. 1의 fib(n-1)을 계산하기 위해 fib(n-2)랑 fib(n-3)을 계산하고, 3. 1의 fib(n-2)를 계산하기 위해 fib(n-3)이랑 fib(n-4)를 계산하고 4. 2의 fib(n-2)를 계산하기 위해 fib(n-3)이랑 fib(n-4)를 계산하고 (3이랑 똑같은데 계산 한번 더 해야 함) ... 결론적으로 fib(n-1)이 1번, fib(n-2)가 2번, fib(n-3)을 3번, f(n-4)를 5번, f(n-5)가 8번, ... n이 커질수록 계산 횟수가 기하급수적으로 증가하게 되므로 지금 사용하신 방법보다는 반복문으로 구하는 것이 훨씬 효율적입니다. 재귀함수로 풀기 위해서는 다음주에 배열을 배우고 나서 아래 코드를 활용하여 다시 도전해보세요. i번째 피보나치 수를 store_fibonacci[i]에 저장해서 빠르게 계산할 수 있습니다. 메모이제이션 기법이라고 불러요 #include <stdio.h> long long store_fibonacci[10000]={0, 1, 1, 2, 3, 5, 8, 13}; // 사실 0, 1까지만 써도 됨. store_fibonacci[i]= (i번째 피보나치 수) long long calculate_fibonacci(long long n) { if (store_fibonacci[n]==0) store_fibonacci[n] = calculate_fibonacci(n-2) + calculate_fibonacci(n-1); // 이전에 계산했던 게 없으면 새로 계산해서 배열에 저장함 return store_fibonacci[n]; // 이전에 계산했던 값을 불러옴 } int main() { for (int n = 1; n < 90; n++) printf("%lld\n", calculate_fibonacci(n)); return 0; }
okkdy0628 Reply 4 years 26 weeks ago
오..... 새로운 내용이군요..! 반복문을 활용해서 풀었습니다. 감사합니다!