Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Sequencia de Fibonacci


cleyvison

Pergunta

Boa noite, preciso fazer uma prgrama que gere um determinado elemento da sequencia de fibonacci. Pois bem, encotrei na net alguns códigos mas, para mi o interessante não é só copiar e com não entendi a lógica do codigo quero pedir a ajuda de um dos men=mbros deste forum o codigo é o seguinte:

 
#include<stdio.h>
#include<conio.h>

double fibonacci (int n)
{
    int a=1,b=1,x,i;
    if(n==1) x=a;
    if(n==2) x=b;
    for(i=3;i<=n;i++){
    x=a+b;
    a=b;
    b=x;
}
    return x;

int main()
{
    int x,n;
    printf("\nDigite n-esimo termo: ");
    scanf("%d",&n);
    x=fibonacci(n);
    printf("\n\n%d\n",x);
    system ("pause");
    return 0;
}

ele roda mas, eu não entendi esta logica...

só pra lembra a sequencia de fibonacci:

1, 1, 2, 3, 5, 8, 13, 21, etc........

Alguqm pode me ajudar?

Link para o comentário
Compartilhar em outros sites

20 respostass a esta questão

Posts Recomendados

  • 0

double fibonacci (int n) //uma função que passa um parâmetro por valor, ou seja, apenas de entrada, é o 
             // elemento que o usuário quer que seja mostrado da sequencia.
{

//declaração e inicialização das variaveis;    

int a=1,b=1,x //x é uma variavel auxiliar,i; 

    if(n==1) 
    x=a; //o primeiro elemento é 1! 'a' esta valendo 1, de acordo com sua inicialização. 
    if(n==2) 
    x=b; //e o segundo também é 1! 'b' esta valendo 1, de acordo com sua inicialização. 

        /*
        repare que isso (acima) está fora do laço do for, logo não repetirá o calculo, pois não é preciso
        visto que os dois primeiros elementos é dado no problema (1º elemento=1 e 2º elemento=1), pois através 
        deles é que é iniciado o calculo da sequencia, pois inicialmente, precisamos de dois elementos para 
        serem somados para gerar o proximo termo. Isso é regra da sequencia de fibonacci.
        */

    for(i=3;i<=n;i++) //para i de 3 (porque já é o terceiro elemento, o primeiro e o segundo você sabe quais são!, 
              //até n (o elemento que deseja exibir). i++, contador incrementado.
    {
        x=a+b; //a sequencia de fibonacci é dada por: soma dos ultimos termos gerados, resulta no próximo.
        //então, some os termos.
        
    //agora é preciso atualizar os dois ultimos termos, pois eles não podem ficar pra sempre sendo 1 e 1.
    a=b; //o valor q esta em 'b', ainda precisamos dele, apenas trocamos ele de lugar pra ficar mais organizado.
                        //ficou no lugar do 'a', pro valor contido em x ficar no lugar do b. 
        b=x; //é preciso guardar o que foi gerado anteriormente (nesse calculo, na primeira passada seria o 2, soma
         de 1+1). Calculamos e guardamos no x, certo!?, então agora o b recebe o x.
    
    
    /*
    agora temos o novos a e b para serem somados e gerarem o próximo elemento.
    */
    
    }
    return x; //esta função retorna o valor de cada elemento calculado.
}
int main()
{
    int x,n;
    printf("\nDigite n-esimo termo: ");
    scanf("%d",&n);
    x=fibonacci(n); //chama a função.
    printf("\n\n%d\n",x);
    system ("pause");
    return 0;
}
    
    /*
    veja essa explicação:
    
    f1 = 1.
    f2 = 1.
    f3 = f1 + f2; f3 = 1+1 = 2.
    f4 = f2 + f3; f4 = 1+2 = 3.
    f5 = f3 + f4; f5 = 2+3 = 5.
    
    Fazendo o teste de mesa:
    
    n |  i = n  ? | a | b | x<-a+b | a<-b | b<-x | x=a+b |
-----------------------------------------------------------------
    5 | i=3. Não  | 1 | 1 |   x=2  | a=1  |  b=1  |  x=2   |
    5 | i=4. Não  | 1 | 2 |   x=3  | a=2  |  b=3  |  x=3   |
    5 | i=5. Sim  | 2 | 3 |   x=5  | a=3  |  b=5  |  x=5   |

    */

SUGESTÃO: Tene fazer um programa para imprimir a sequencia onde o usuário enra com a quanidade que deseja exibir e enão, em vez de exibir somente o último termo, o S, exibe, no caso, N=5: 1, 1, 2, 3, 5.

E antes de procurar na interne a solução, pense muito e tente resolver.

Editado por Mônica Bonna
Adicionar tag CODE e Caixa Ala.
Link para o comentário
Compartilhar em outros sites

  • 0

aline, editei seu post e pus o codigo com a explicacao dentro da tag CODE pra ficar mais facil de enxergar. não tem problema ne??

int a=1,b=1,x //x é uma variavel auxiliar,i; 

    if(n==1)
    x=a; //o primeiro elemento é 1! 'a' esta valendo 1, de acordo com sua inicialização.
    if(n==2)
    x=b; //e o segundo também é 1! 'b' esta valendo 1, de acordo com sua inicialização.

        /*
        repare que isso (acima) está fora do laço do for, logo não repetirá o calculo, pois não é preciso
        visto que os dois primeiros elementos é dado no problema (1º elemento=1 e 2º elemento=1), pois através
        deles é que é iniciado o calculo da sequencia, pois inicialmente, precisamos de dois elementos para
        serem somados para gerar o proximo termo. Isso é regra da sequencia de fibonacci.
        */[/code]

isso aqui ficou meio estranho. tipo, não é mas facil setar 1 direto, porque duas variaveis valendo 1?? mas pelo menos funciona.

mas ficou faltando tb fehcar a funcao (com }). o codigo original ta assim tb?? se tivesse acho q não ia nem compilar.

Link para o comentário
Compartilhar em outros sites

  • 0
aline, editei seu post e pus o codigo com a explicacao dentro da tag CODE pra ficar mais facil de enxergar. não tem problema ne??

int a=1,b=1,x //x é uma variavel auxiliar,i; 

    if(n==1) 
    x=a; //o primeiro elemento é 1! 'a' esta valendo 1, de acordo com sua inicialização. 
    if(n==2) 
    x=b; //e o segundo também é 1! 'b' esta valendo 1, de acordo com sua inicialização. 

        /*
        repare que isso (acima) está fora do laço do for, logo não repetirá o calculo, pois não é preciso
        visto que os dois primeiros elementos é dado no problema (1º elemento=1 e 2º elemento=1), pois através 
        deles é que é iniciado o calculo da sequencia, pois inicialmente, precisamos de dois elementos para 
        serem somados para gerar o proximo termo. Isso é regra da sequencia de fibonacci.
        */

isso aqui ficou meio estranho. tipo, não é mas facil setar 1 direto, porque duas variaveis valendo 1?? mas pelo menos funciona.

mas ficou faltando tb fehcar a funcao (com }). o codigo original ta assim tb?? se tivesse acho q não ia nem compilar.

É... era mais pratico setar 1 direto, mas eu não modifiquei o codigo, quem postou só queria a explicação, então só expliquei o codigo que ele mesmo postou.

E quanto a fechar a função, é eu vi, pois compilei pra ver o que exatamente fazia, e editei e arrumei.

E tem problema nenhum editar, eu até esperava que alguém fizesse isso, porque eu não estava sabendo como colocar como código, agora eu sei. Obrigada.

Editado por AlineI
Link para o comentário
Compartilhar em outros sites

  • 0

olha cara, só te falo o seguinte...

você nunk vai aprender a logica da programacao se primeiro pesquisar na net pra depois tenta fazer...

sempre tente bastante, e quando estiver esgotado de tentar, pesquise sobre algo parecido, nunk a resposta..

olhe a resposta apenas quando tiver feito o seu para poder comparar o codigo e ver o q você deve melhorar para ficar mais legivel, rapido e outras coisas...

só um toque aew

Link para o comentário
Compartilhar em outros sites

  • 0

LuKaum,

Tentei bastante só depois pesquisei na net e não parei por ai, se eu não quizesse aprender não teria pedido ajuda.

Aline,

Muito obrigado pela explicação

Vou tentar fazer o que sugeriu depois posto o que consegui, se eu conseguir fazer alguma coisa, rsrsrsrrs.

Vou tb dar umas 25 relidas na explicação pra entender...

mas neste ponto eu não entendi

for(i=3;i<=n;i++) 

//para i de 3 (quer dizer para i igual a 3? literalmente a variavel i vale 3?
//se i maior ou igual a n ( n é a posição do numero, beleza)
//i++, sei que o contador ira encrementar mas, por exemplo se n=4, quanto vala i? com que frequencia o contador vai incrementar? 4+1,5+1,6+1?
    
{
        x=a+b; 
//aqui a e b ainda valem 1?
// e onde entra o i nesta conat todinha?

Obrigado mais uma vez....

Editado por cleyvison
Link para o comentário
Compartilhar em outros sites

  • 0

Foi isso que sugeriu? o 1º e 2º sabemos que é 1, rsrsrsr

double fibonacci (int n)
{
              int a=1,b=1,x,i,cont=0; 
              if(n==1) x=a;
              if(n==2) x=b;

              for(i=3;i<=n;i++)
              {
              x=a+b;
              a=b;  
              b=x;  
              printf ("\n na posicao %i o valor = %i\n",i, x);
              }
              return x; 
    

}

int main()
{
    int x,n;
    printf("\nDigite ate que posição que ir na sequencia: ");
    scanf("%d",&n);
    x=fibonacci(n);
    system ("pause");
    return 0;
}

Link para o comentário
Compartilhar em outros sites

  • 0

double fibonacci (int n)
{
              int a=1,b=1,x,i;

              printf("\n Na posicao 1 o valor = 1\n");
              printf("\n Na posicao 2 o valor = 1\n");

              for(i=3;i<=n;i++)
              {
                x=a+b;
                a=b;
                b=x;

                printf("\n na posicao %i o valor = %i\n",i, x);
              }
              return x;
}

int main()
{
    int x,n;
    printf("\nDigite ate que posição que ir na sequencia: ");
    scanf("%d",&n);
    x=fibonacci(n);
    system ("pause");
    return 0;
}

Assim que deverá ser, pelo menos é uma resolução, já imprimi 1 e 1...

E quanto ao for que começa de 1, i é o contador, porque estava declarado um contador? rs.

Não que não use quando usar for (porque for já tem contador), mas no caso não sei porque você colocou, pra que quis usar.

o contador começa do 1, no caso desse exercicio... então, na posição 1 do i, está o 1, e na posição 2 está o 1 também, os dois primeiros elementos que não eram precisos calcular, pois já eram dados. Por isso começa o for pela posição 3.

Link para o comentário
Compartilhar em outros sites

  • 0

void fibonacci (int n)
{
              int a=1,b=1,i,x;

              printf("\n Na posicao 1 o valor = 1\n");
              printf("\n Na posicao 2 o valor = 1\n");

              for(i=3;i<=n;i++)
              {
                x=a+b;
                a=b;
                b=x;

                printf("\n na posicao %i o valor = %i\n",i, x);
              }
}

int main()
{
    int n;
    printf("\nDigite ate que posição que ir na sequencia: ");
    scanf("%d",&n);
    fibonacci(n);
    system ("pause");
    return 0;
}

Maaas, retornar o x agora não seria o correto, embora tenha funcionado.

Pois você está escrevendo já o resultado dentro da função...

Então creio que assim seria mais válido: a função não retornar, ser void, e apenas ser chamada la na main.

Nesse caso e em muitos outros é mais fácil e prático escrever nas funções, porém meu prof dizia que não poderia fazer isso, na função fica só o calculo, na main imprimi tudo que tiver que imprimir, e isso tras algumas dificuldades, e isso também treina passagens de parâmetros.

Link para o comentário
Compartilhar em outros sites

  • 0

Vou tentar fazer fora da função...

Mas, o meu Prof. dizia que não existe forma certa de programar e sim a forma que funciona por exemplo você pode fazer uma rotina usanda "for" ou, a mesma usando, "while" mas, o resultado tem que ser o mesmo.

Mesmo asism obrigado pela ajuda.....

void fibonacci (int n)
{
              int a=1,b=1,i,x;

              printf("\n Na posicao 1 o valor = 1\n");
              printf("\n Na posicao 2 o valor = 1\n");

              for(i=3;i<=n;i++)
              {
                x=a+b;
                a=b;
                b=x;

                printf("\n na posicao %i o valor = %i\n",i, x);
              }
}

int main()
{
    int n;
    printf("\nDigite ate que posição que ir na sequencia: ");
    scanf("%d",&n);
    fibonacci(n);
    system ("pause");
    return 0;
}

Maaas, retornar o x agora não seria o correto, embora tenha funcionado.

Pois você está escrevendo já o resultado dentro da função...

Então creio que assim seria mais válido: a função não retornar, ser void, e apenas ser chamada la na main.

Nesse caso e em muitos outros é mais fácil e prático escrever nas funções, porém meu prof dizia que não poderia fazer isso, na função fica só o calculo, na main imprimi tudo que tiver que imprimir, e isso tras algumas dificuldades, e isso também treina passagens de parâmetros.

Link para o comentário
Compartilhar em outros sites

  • 0
Nesse caso e em muitos outros é mais fácil e prático escrever nas funções, porém meu prof dizia que não poderia fazer isso, na função fica só o calculo, na main imprimi tudo que tiver que imprimir, e isso tras algumas dificuldades, e isso também treina passagens de parâmetros.

a mas ai existe procedimento (procedure) e funcao (function). a diferenca é q function retorna valor e procedure não. em c procedure você faz declarando a funcao como tipo void (não retorna valor).

não necessariamente na main imprime tudo. mtas vezes se você for imprimir tudo na main o codigo dela pode ficar gigante e complicado de entender. imagina q você precisa monta a tela com moldura e td mais (em c isso nem é muito comum, mas em clipper por exemplo, a gente fazia muito isso), é melhor faze uma procedure separada pra isso. tipo, mtas vezes o programa não é sequencial, e tem varias opcoes. cada hora pode precisar imprimir uma coisa de acordo com o q o usuario fizer, e as vezes é bom separar em otras procedures.

Mas, o meu Prof. dizia que não existe forma certa de programar e sim a forma que funciona por exemplo você pode fazer uma rotina usanda "for" ou, a mesma usando, "while" mas, o resultado tem que ser o mesmo.

eu penso o contrario, tem q dar tanta importancia ao codigo quanto ao resultado. tem uns cara q faz qualquer gambiarra ai e como funciona pra ele ta bom. mas ai o codigo ta horrivel, faz um mte de coisa desnecessaria e, o pior de tudo, o proprio cara q fez não entende uma unica linha e ai se um dia precisa altera o cara quase se mata porque não vai conseguir mexe em nd.

Link para o comentário
Compartilhar em outros sites

  • 0

Kuroi..

Sim, sei que procedimentos não retornam e funções sim. O que eu disse tem nada a ver com isso, acontece que tanto procedimentos como funções são passados parametros para mandar um ou mais resultados para outras funções ou para a main, em função pode se tornar mais facil caso queira retornar apenas um resultado, então a função pode retornar apenas um... mas se for precisar de outros resultados de calculos, usa-se a passagem de parametros (por valor ou por referencia).

Mas em C, não existe procedimentos... existem funções que retornam e funções que não retornam (void), mas ambas passam parametros, os de referencia utiliza-se ponteiros.

Então... sim, algumas vezes é mais pratico e tudo mais, ESCREVER (PRINTF), nas funções... mas o aconselhado é apenas RETORNAR E PASSAR PARAMETROS DE ENTRADA (por valor) OU/E DE ENTRADA E SAIDA (por referencia), e usar a função em outro local (em outras funções ou na main), atribuir a alguma variavel e imprimir na main... e na maioria das vezes isso necessita passagens a mais de parametro, do que precisaria caso escrevesse na função, mas realmente escrever na função eu não acho errado... só disse q meu prof disse q é mais certo funções haverem apenas calculos, retorno (ou não no caso de C) e passagens de parametros...

Se é mais certo não sei bem dizer, mas q treina MUITO mais a passagem de parametros, isso é certeza! Ainda mais quando se usa função dentro de função... depois procurar imprimir somente na main, com certeza encontrará mais dificuldade procurando escrever somente na main.

Agora POG tem de muitos jeitos, mas isso não é comigo... conheço gente q é expert nisso, não sei como consegue complicar tanto o programa.

Link para o comentário
Compartilhar em outros sites

  • 0
Mas em C, não existe procedimentos... existem funções que retornam e funções que não retornam (void), mas ambas passam parametros, os de referencia utiliza-se ponteiros.

aline, qual a diferenca entre procedimento e funcao q não retorna valor?? se não retorna valor nem é funcao.

e tb não acho errado escrever em procedimento, afinal é pra isso mesmo q ele existe.

Link para o comentário
Compartilhar em outros sites

  • 0
Guest --AlineI --

Lembra que no programa inicial que você postou estava

int nomeDaFuncao (tipo variavel //parametros)
e depois na outra versão eu disse que não era mais necessário retornar o x, então teria q ser void então, no lugar do int se coloca void:
void nomeDaFuncao(tipo variavel //parametros)

Então... considere que essa função acima seja um procedimento, ele não retorna um resultado, mas em C continua sendo função (q quando não retorna é void).

Essa é a unica diferencia de procedimentos e funções, procedimento não retorna valor, só passa por parametro, e função retorna e passa por parametro.

Link para o comentário
Compartilhar em outros sites

  • 0
Guest --AlineI --

Ops, pensei que tava respondendo pro dono do tópico.

Mas foi pro Kuroi.

Então, não tem diferença, C que não interpreta procedimentos, interpreta como uma função que não retorna valor, apenas passa parametros... ou não, pode existir uma função que nem parâmetros passa, veja:

void Imprimi () 
{

Link para o comentário
Compartilhar em outros sites

  • 0
Guest --AlineI --

ê caramba...rsrs.

tava escrevendo e fui apertando tab pensando q ia dar tabulação e mandou sem eu terminar.

e eu não sei como q exclui a resposta.

void imprime()
{
    printf("\n::.TABULEIRO.::\n");
    printf("\n %c | %c | %c \n", c1, c2, c3);
    printf("___________\n");
    printf(" %c | %c | %c \n", c4, c5, c6);
    printf("___________\n");
    printf(" %c | %c | %c \n", c7, c8, c9);
}

Usei essa função pra fazer um jogo da velha, ir atualizando e exibindo o tabuleiro no decorrer do jogo.

Link para o comentário
Compartilhar em outros sites

  • 0

estava na minha aula de matematica hoje dai eu pensei em criar um codigo, e achei um pouco otimizado, esse mostra o enésimo numero da sequência

#include <stdio.h>

int main(){
int i,x,y,j;
scanf("%d",&j);
x=y=1;
for(i=0;i<=(j-1);i++){
y=x-y;
x=y+x;
}

printf("%d\n",x);

}

 

e esse aqui mostra toda a sequência

 

#include <stdio.h>

int main(){
int i,x,y,j;
scanf("%d",&j);
x=y=1;
printf("%d\n",x);
for(i=0;i<=(j-1);i++){
y=x-y;
x=y+x;
printf("%d\n",x);
     }
}

Link para o comentário
Compartilhar em outros sites

  • 0

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

int main ()
{
int n,i;
    for(i;n!=0;i++)
    {
        scanf("%d",&n);
        system("cls");
            printf("Fibonacci(%d) = %.0lf\n",n,((pow(((1+sqrt(5))/2),n)-pow(((1-sqrt(5))/2),n))/sqrt(5)));
    }
}

Link para o comentário
Compartilhar em outros sites

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

int main(void) {
    
    int a = 0;
    int b = 1;
    for (int i = 1; i < 50; i = a + b){
        b = a;
        a = i;
        printf("- %i ", i);
    }
}

O jeito mais simples que achei de fazer é este. 
Mas ele mostra o a sequencia até o numero que está na condição. No caso seria até o valor de fib menor que 50

Mas podemos fazer assim se quisermos saber até o N termo.

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

int main(void) {
    int x = 0;
    int a = 0;
    int b = 1;
    for (int i = 1; i < 10; i++){
        x = a + b;
        b = a;
        a = x;
        printf("- %i ", x);
    }
}

 

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...