Linux slogan
Visite também: Segurança Linux · BR-Linux.org · Dicas-L · Doode · NoticiasLinux · SoftwareLivre.org · UnderLinux



» Screenshot
Linux: KURUMIN 2.20
Por ZIPPO
» Login
Login:
Senha:

Se você ainda não possui uma conta, clique aqui.

Esqueci minha senha



Scripts

Linux user

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

Login: vinipsmaker, 276720 pontos

Homepage: http://vinipsmaker.wordpress.com/   


Descrição

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.

[ Download: fibonacci.c ]   [ Enviar nova versão ]

Versões atualizadas deste script (NOVO)
Linux user

Publicado por Vinícius dos Santos Oliveira em 16/11/2009

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

(versão 2)

 

[ 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
   Script Linux recomendado Números Primos
   Script Linux recomendado Grafo
   Script Linux recomendado A - Comando Strcat
   Script Linux recomendado Checkcred - Checagem de créditos.
   Script Linux recomendado OpenGL - Planeta em Órbita

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


  
Para executar esta ação você precisa estar logado no site, caso contrário, tudo o que for digitado será perdido.
Responsável pelo site: Fábio Berbert de Paula - Conteúdo distribuído sob licença GNU FDL
Site hospedado por:

Viva o Linux

A maior comunidade Linux da América Latina! Artigos, dicas, tutoriais, fórum, scripts e muito mais. Ideal para quem busca auto-ajuda em Linux.