| Linha | Codigo |
| 001 | // Prof. Leo^nidas - http://www.matematica.br http://line.ime.usp.br |
| 002 | // MAC0122 - 2017/08/04 |
| 003 | |
| 004 | // Eficiencia = algoritmos + estuturas de dados + matematica + ... |
| 005 | // Sequencia de Fibonacci: Fi = 1, se i=1 ou i=2 e Fi = F(i-1)+F(i-2), se i>2 |
| 006 | |
| 007 | #include <stdio.h> |
| 008 | #include <time.h> // clock_t, clock() |
| 009 | |
| 010 | // Fibonacci iterado: computa de modo "guloso", a partir do menor indice, nunca repetindo (O(n)) |
| 011 | int fib (int n) { |
| 012 | int i, F1=1, F2=1, F; |
| 013 | if (n<3) return 1; |
| 014 | for (i=3; i<=n; i++) { |
| 015 | F = F1+F2; |
| 016 | F1 = F2; |
| 017 | F2 = F; |
| 018 | } |
| 019 | return F; |
| 020 | } |
| 021 | |
| 022 | // Fibonacci recursivo: computa repetidas vezes (O(2^n)) |
| 023 | int fibRec (n) { // os finalizadores ';' sao opcionais em Python |
| 024 | if (n==1 || n==2) return 1; // final de recorrencia |
| 025 | return fibRec(n-1) + fibRec(n-2); // senao devolve |
| 026 | } |
| 027 | |
| 028 | int main (void) { |
| 029 | int n, fibA; clock_t tempo_inicial, tempo_final; |
| 030 | scanf("%d", &n); |
| 031 | |
| 032 | tempo_inicial = clock(); // "dispara o cronometro"... |
| 033 | fibA = fib(n); |
| 034 | tempo_final = clock(); |
| 035 | printf("Iterativo: %3d -> %3d em %f segundos\n", n, fibA, (double)(tempo_final - tempo_inicial) / CLOCKS_PER_SEC); |
| 036 | |
| 037 | tempo_inicial = clock(); // "dispara o cronometro"... |
| 038 | fibA = fibRec(n); |
| 039 | tempo_final = clock(); |
| 040 | printf("Recursivo: %3d -> %3d em %f segundos\n", n, fibA, (double)(tempo_final - tempo_inicial) / CLOCKS_PER_SEC); |
| 041 | return 0; |
| 042 | } |