Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Fibonacci

Favor não testar!

#include <stdio.h>
#include <stdlib.h>

int fibonacci(int n){
    if(n == 0) return 0;
    if(n == 1) return 1;
    return fibonacci(n-1) + fibonacci(n-2);
}

int main(){
    for(int i = 0; i < 100; i++){
        printf("%d\n", fibonacci(i));
    }
}
1 resposta
solução!

Olá, Henrique!

Parece que você já tem uma função recursiva para calcular a sequência de Fibonacci, que está correta. Entretanto, você está tentando imprimir os primeiros 100 números da sequência, o que pode causar um tempo de execução muito longo e possivelmente um estouro de pilha, devido à natureza exponencial da função recursiva.

A sequência de Fibonacci cresce rapidamente e a recursão que você está usando faz muitos cálculos repetidos. Por exemplo, para calcular fibonacci(5), você calcula fibonacci(4) e fibonacci(3). Mas para calcular fibonacci(4), você calcula fibonacci(3) e fibonacci(2). Observe que fibonacci(3) é calculado duas vezes. Isso piora à medida que os números aumentam.

Uma solução para isso é usar uma técnica chamada memoização, onde você armazena os resultados de cálculos caros e os reutiliza quando necessário, em vez de recalcular. Aqui está um exemplo de como você pode fazer isso em C:

#include <stdio.h>
#include <stdlib.h>

#define MAX 100

long long memo[MAX];

long long fibonacci(int n){
    if(n == 0) return 0;
    if(n == 1) return 1;
    // Se o valor já foi calculado, retorna ele
    if(memo[n] != -1) return memo[n];
    // Senão, calcula e armazena no array
    memo[n] = fibonacci(n-1) + fibonacci(n-2);
    return memo[n];
}

int main(){
    // Inicializa o array com -1
    for(int i = 0; i < MAX; i++){
        memo[i] = -1;
    }
    // Agora a função pode ser chamada para n = 100
    for(int i = 0; i < 100; i++){
        printf("%lld\n", fibonacci(i));
    }
}

Esta versão da função irá calcular cada valor da sequência de Fibonacci apenas uma vez e armazená-lo, tornando a função muito mais eficiente.

Espero ter ajudado e bons estudos!