Sequência fibonacci com 35 linhas e for

Publicado por Vinícius dos Santos Oliveira 21/05/2009 (última atualização em 10/12/2009)

[ Hits: 17.649 ]

Homepage: https://vinipsmaker.github.io/

Download fibonacci.c

Download 1258372979.fibonacci.c (versão 2)




Após dias sem abrir o arquivo-apostila eu continuei a ler e vendo o comando "for". Então tive a idéia de fazer um programa para calcular a sequência fibonacci.

Você digita quantos números quer ver e a sequência fica limitada apenas pelo computador.

  



Versões atualizadas deste script

Versão 2 - Enviado por Vinícius dos Santos Oliveira em 16/11/2009

Changelog: Diminuí o número de linhas de acordo com meu primeiro comentário.

Download 1258372979.fibonacci.c


Esconder código-fonte

#include <stdio.h>
void main()
{
 int n1 = 1 , n2 = 1 , n3 , v1 , v2 , v3 = 1;
 printf("Quantos números você quer ver?\n");
 scanf("%i" , &v1);
 printf("Sequência:\n");
 if(v1 == 2 || v1 == 1)
 {
  printf("1\n");
  if(v1 == 2)
   printf("1\n");
 }
 else if(v1 > 2)
 {
  v1 -= 2;
  v2 = v1;
  printf("1\n1\n");
  for(v3 == 1 ; v2 != 0 ; v3 = 0)
  {
   n3 = n2;
   n2 = n1;
   n1 = n2 + n3;
   printf("%d\n" , n1);
   v2 -= 1;
  }
 }
 else
 {
  if(v1 != 0)
   printf("Número inválido para a sequência\n");
 }
}

Scripts recomendados

Jogo da cobrinha (Snake II) refeito em C e C++

Descompactador Simples

Argv e Argc

Soma entre matrizes

gotoxy() no Linux


  

Comentários
[1] Comentário enviado por vinipsmaker em 21/05/2009 - 11:13h

Consegui reduzir o número de linhas para 27, e o script ficou melhor para o aprendizado também:
#include <stdio.h>
void main()
{
int n1 = 1 , n2 = 1 , n3 , v1 , i;
printf("Quantos números você quer ver?\n");
scanf("%i" , &v1);
printf("Sequência:\n");
if(v1 == 2 || v1 == 1)
{
printf("1\n");
if(v1 == 2)
printf("1\n");
}
else if(v1 > 2)
{
printf("1\n1\n");
for(i = (v1 - 2) ; i != 0 ; i -= 1)
{
n3 = n2;
n2 = n1;
n1 = n2 + n3;
printf("%d\n" , n1);
}
}
else if(v1 != 0)
printf("Número inválido para a sequência\n");
}

[2] Comentário enviado por allisonvoll em 22/05/2009 - 09:59h

Reduzi para 24, se tirar os espaços e identação como o colega acima e o autor do script, cai para 17

#include <stdio.h>

int main(int argc, char** argv)
{
int v1,i;

printf("Quantos números você quer ver?\n");
scanf("%d",&v1);

printf("Sequência:\n");

if (v1 <= 2)
{
printf("1\n");
return 0;
}

int a = 1, b = a, c;

for (i=0; i<v1; i++,c=a,a=a+b,b=c)
printf("%d\n", b);

return 0;
}

[3] Comentário enviado por ajansmit em 22/05/2009 - 18:29h

Diminua para 24 (incluindo perda de espaço) usando recursividade.

/*Retorna um termo da série Fibonacci: */
#include <stdio.h>
#include <stdlib.h>
int fib(int n);
int main()
{
int r, num;
printf("Digite um número\n");
scanf("%d", &num);
r = fib(num);
printf("%d\n", r);
}

int fib(int n)
{
if(n<=2)
{
return 1;
}
else
{
return fib(n-2)+fib(n-1);
}
}

[4] Comentário enviado por vinipsmaker em 22/05/2009 - 19:20h

Achei interessante o uso da recursividade.

[5] Comentário enviado por Teixeira em 24/05/2009 - 12:31h

Um pouco de história:
Fibonacci era um matemático italiano que lá pelos idos de 1202 ficou fascinado com a capacidade de reprodução dos coelhos.
Decidiu então crar um modelo que demonstrasse o crescimento de uma comunidade de coelhos, assumindo como verdadeiras as seguintes regras:

1- Que os coelhos atingem a idade madura em um mês a partir do nascimaento;

2- Que a cada mês um casal de coelhos produzirá um par de novos coelhos;

3- Que os coelhos são imortais.

Claro que ele não levou em consideração o sexo dos coelhos provenientes da primeira leva e das sebsequentes. Mas tudo isso não passa de mera teoria, e - naquela época - de curiosidade matemética.

A título de ilustração, aqui está um programinha ingênuo em basic que demonstra de fora rústica os números de Fibonacci:

10 LET A=0
20 LET B=1
30 LET C=A+B
40 PRINT C
50 LET A=B
60 LET B=C
70 GOTO 30

O programa do jeito que está não para nunca (entra em loop infinito). Falta-lhe um loop de controle. Em basic serão poucas linhas a mais.
Em C, Assembly, etc. o número de linhas será sensivelmente maior.

Além do que, ele começa do um (um coelho hermafrodita?).

Sempre existem maneiras de melhorar um código, a partir do momento em que se entenda o problema e os caminhos para a solução.

Será que dá para encurtar mais ainda o código sugerido pelo vinipsmaker e comentado pelos colegas?
(Isto é uma provocação - no bom sentido, é claro).










[6] Comentário enviado por thiagodorneles em 25/05/2009 - 10:42h

Ola!

Reduzi seu código um pouco mais, para 15 linhas.

Note que usei uma função recursiva devolvendo o valor, segue abaixo:

#include<stdio.h>

long int fibo(int n){
return ((n<2)?1:(fibo(n-2)+fibo(n-1)));
}
int main()
{
int v=0;
long int r=0;
printf("Quantos deseja: ");
scanf("%d",&v);
r = fibo(v);
printf("Resultado fibonacci: %ld\n",r);
}

Somente para mencionar, utilizei as posições fibonacci como se fosse um vetor, ou seja, posição 0 igual ao primeiro valor, e assim sucessivamente, diferente dos outros códigos acima. Mas isso é somente para frizar como meu codigo funciona. Abaixo segue a tabela demonstrando:
Posicao | 0 | 1 | 2 | 3 | 4 | 5 | 6
-------------------------------------
Valores | 1 | 1 | 2 | 3 | 5 | 8 | 13

Outra coisa, claro que mudei um pouco a idéia do autor que era imprimir a sequencia de valores até a certa posição informada pelo usuário, fiz de maneira somente para retornar uma posição determiada.
Isto se resolveria simplesmente, note abaixo ficando apenas com 17 linhas, segue:

#include<stdio.h>
long int fibo(int n){
return ((n<2)?1:(fibo(n-2)+fibo(n-1)));
}
int main(){
int v=0,i=0;
long int r=0;
printf("Quantos deseja: ");
scanf("%d",&v);
for (i=0;i<v;i++){
r = fibo(i);
printf("%ld ",r);
}
printf("\n");
}

Até mais!!!

[7] Comentário enviado por danielgimenes em 27/05/2009 - 01:10h

talvez achem interessante.

http://www.vivaolinux.com.br/script/Fibbonacci-com-Memorization-(O(N))/?

Detalhe: o nome da técnica é Memoization, n Memorization...

[8] Comentário enviado por allisonvoll em 27/05/2009 - 11:35h

Partindo do princípio do código em basic ilustrado por teixeira, segue um pequeno algorítimo apenas com o miolo do fibonacci (como o feito em basic) também em 7 linhas, em loop infinito portanto quebra o limite de longint logo de ínicio.

#include <stdio.h>
int main(){
long int a=1,b=1,c;
for (;;c=a,a=a+b,b=c)
printf("%d\n",b);
return 0;
}


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts