Ir ao conteúdo
  • Cadastre-se
jbhorizontece

Estou aqui novamente com mais uma Dúvida agora é com a função Fibonacci.

Recommended Posts

Galera alguém poderia me ajudar a entender como esse código de Fibonacci funciona de como ele faz os cálculos. Isso que é um pouco difícil não sei como ele calcula até dar o retorno sem usar nenhum laço, gostaria de uma força aí pessoal. :)

 

segui o  código aí galera.

 

há paciência aí comigo que estou aprendendo agora c e c++ :) um abraço para todos.

#include<iostream>#include<cstdio>using namespace std;//FIBONACCI FEITO ATREVÉS DE RECURSIVASunsigned long fibonacci(unsigned long);int main(){unsigned long numero, resultado;            cout<<"Digite um Inteiro: ";    cin>>numero;            resultado=fibonacci(numero);    cout<<"Fibonacci ("<<numero<<") = "<<resultado<<endl;    system("pause");    return 0;}    unsigned long fibonacci(unsigned long n)    {                            if(n==0 || n==1)                return n;                    else            return fibonacci(n-1) + fibonacci(n-2);}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não entendo, C++... mas  pelo óbvio, é usada a recursividade.  leia mais aqui: http://www.tiexpert.net/programacao/c/recursividade.php

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

voce tem que entender primeiro como funciona recursão,se nao nao vai entender nada que envolva recursão..

tentei exemplificar nessa função

 

Primeiro fiz sem recursão ,depois a com recursão

void FFibo2(int n){    int x2 = 1;    int x1 = 0;    while(n > 0)    {        x1 = x1 + x2;//1º rodada = 1; 2º rodada = 3; 3º rodada = 8(de 3 + 5);        x2 = x2 + x1;//1º rodada = 2; 2º rodada = 5; 3º rodada = 13(de 5 + 8);    }}void FFiboR(int n,int ant,int res){    if(n == 0)//Se n for 0 sai da recursão        return;        std::cout<<res <<" "<< ant << " ";    FFiboR(n -1,ant += res,res += ant);//"n - 1" é o que vai simplificando a recursão até que ela satisfaça a condição acima                                                           //ant += res é a soma do segundo numero(que é 1 agora) + o 1º (como o algoritmo diz para fazer)                                                           //res +=ant é o primeiro numero(agora é 0 agora) + o segundo numero ("ant",que é 1 agora)}void FFibo3(int n){    FFiboR(n - 1,1,0);}int main(){    FFibo3(6);        system("pause");    return 0;}
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

voce tem que entender primeiro como funciona recursão,se nao nao vai entender nada que envolva recursão..

tentei exemplificar nessa função

 

Primeiro fiz sem recursão ,depois a com recursão

 

void FFibo2(int n)

{

    int x2 = 1;

    int x1 = 0;

    while(n > 0)

    {

        x1 = x1 + x2;//1º rodada = 1; 2º rodada = 3; 3º rodada = 8(de 3 + 5);

        x2 = x2 + x1;//1º rodada = 2; 2º rodada = 5; 3º rodada = 13(de 5 + 8);

    }

}

 

 

 

void FFiboR(int n,int ant,int res)

{

    if(n == 0)//Se n for 0 sai da recursão

        return;

    

    std::cout<<res <<" "<< ant << " ";

    FFiboR(n -1,ant += res,res += ant);//"n - 1" é o que vai simplificando a recursão até que ela satisfaça a condição acima

                                                           //ant += res é a soma do segundo numero(que é 1 agora) + o 1º (como o algoritmo diz para fazer)

                                                           //res +=ant é o primeiro numero(agora é 0 agora) + o segundo numero ("ant",que é 1 agora)

}

void FFibo3(int n)

{

    FFiboR(n - 1,1,0);

}

 

 

int main()

{

    FFibo3(6);

    

    system("pause");

    return 0;

}

Atlos a função FFiboR só vai retornar o seu valor quando ela encontrar todos os números 1 para fazer a soma deles e fazer retorno do resultado da soma desses números, para gerar o numero FFiboR?

Compartilhar este post


Link para o post
Compartilhar em outros sites

para o parametro "n" voce passa um numero(esse vai ser o numero de quantas vezes vai recursionar,ou seja,da quantidade de sequencias Fibonacci que vai ser mostrada)

 

Aqui  "FFiboR(n -1,ant += res,res += ant)" , ela vai chamar ela mesma de novo somando ant = ant(1)  + res(0),no parametro "ant" e res = res(0) + ant(1),no parametro "res",na próxima vez que ela for chamar ela de novo ja será ant = ant(1) + res(1) e res = res(1) + ant(1)

 

Existem bons livros de algoritmos,http://www.amazon.com/s/ref=nb_sb_noss_1?url=search-alias%3Dstripbooks&field-keywords=C%2B%2B%20Algorithms

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

por exemplo: Se eu entrei  com o numero 3 então ela vai passar para a função fib esse numero e nela vai fazer o calculo até encontrar os valores que são 1 para somar esses valores diminuídos de f(3) e assim encontrando o numero 2 que é o numero do fibonacci  de f(3) = 2 e retornar esse numero 2 para 'main'  assim mostrando na tela o valor 2 que é fibonacci 2. Achei a recursividade parecida com um loop porque vi que dessa forma recursiva também é como se tivesse usando um loop legal, isso, se eu tiver errado me corrija por favor . :)

 estou amando aprender programar em c/ c++. srrsrsrsrsrsrs

Acho que estou indo bem.


No meu caso estou quero dizer que ele faz isso:

 

       //return (fibonacci(n-1) + fibonacci(n-2)) ele entra com três  na função.

e então faz o calculo que está embaixo.                 

              por exemplo:       //f(3)= f(2)+f(1)   no f(3) ele leva o numero 3 para a função fibonacci e faz o calculo onde é encontrado "fibonacci (f(2)+f(1))" e depois feito isso ele encontrou 1 e guardou para realizar a soma mais tarde. e então ele pega o f(2) como não é 1 e chama ele para fazer o calculo novamente.
                                         //f(2)=f(1)+f(0)   agora f(2) ele leva o numero 2 para a função e faz o calculo onde é encontrado "fibonacci (f(1)+f(0))" como quebramos a função em parti ele encontrou os numero que estão embaixo para a soma e acha o valor do fibonacci que é 2. :)
                                          //f(1)+f(1)=2

eu entendi assim :) se eu estiver errado por favor me corrija pls.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×