domingo, 4 de maio de 2014

Sequência de Fibonacci


Leonardo Fibonacci

Leonardo Fibonacci, matemático italiano (Pisa, c. 1170 — c. 1250).ele ficou conhecido pela sequência de Fibonacci e pelo seu papel na introdução dos algorismos arábicos na Europa.
Ao reconhecer que a aritmética, com algarismos arábicos, era mais simples e eficiente do que com os algarismos romanos, Fibonacci viajou por todo o mundo mediterrâneo, chegando até Constantinopla, para estudar com os matemáticos árabes mais importantes de então, alternando os estudos com a atividade comercial.
Seus estudos foram tão importantes que até hoje existe uma publicação periódica, Fibonacci Quarterly inteiramente dedicada à sequência aritmética elaborada por ele.
Ele, propôs no século XIII, a sequência numérica abaixo:
(1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...)
Essa sequência tem uma lei de formação simples: cada elemento, a partir do terceiro, é obtido somando-se os dois anteriores. Veja: 1+1=2, 2+1=3, 3+2=5 e assim por diante.
Veja um exemplos de sua aplicação.
A partir de dois quadrados de lado 1, podemos obter um retângulo de lados 2 e 1. se adicionarmos a esse retângulo um quadrado de lado 2, obtemos um novo retângulo 3x2. Se adicionarmos agora um quadrado de lado 3, obtemos um retângulo 5x3. Observe a figura a seguir e veja que os lados dos quadrados que adicionamos para determinar os retângulos formam a sequência de Fibonacci.



Se utilizarmos um compasso e traçarmos o quarto de circunferência inscrito em cada quadrado, encontraremos uma espiral formada pela concordância de arcos cujos raios são os elemento da seqüência de Fibonacci.




Sequencia de Fribonacci



Essa sequência é definida como recursiva. Sendo Fn  os termos dessa sequência que são chamados de números de Fibonacci.  Aqui vão os primeiros termos dessa sequência:

 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233...


Código em Pascal

Program Pzim ;
  Uses Crt; 
 var 
  i,n : Integer; 
  fb : Array [0..20] of Integer; 
 begin 
  ClrScr; 
  WriteLn ('Serie de Fibonacci de 1 a 20'); 
  WriteLn; 
  // Definicao 
  fb[0] := 0; 
  fb[1] := 1; 
  // Calculo 
  for i := 2 to 20 do 
   fb[i] := fb[i-1]+fb[i-2]; 
  // Resultados 
  for i := 0 to 20 do 
   WriteLn ('f(',i:2,')=', fb[i]:7); 
  ReadLn; // Pausa 
 End.

Código em C

// Inclui o arquivo <"stdio.h">
// stdio.h é responsável pelas funções de entrada e saída.
#include "stdio.h"

// A função main() é obrigatória em todo programa C.
void main()
{
  // Declaração de variáveis.
  int a, b, auxiliar, i, n;

  // Aqui foi necessário atribuir valores as variáveis a e b.
  a = 0;
  b = 1;

  // A função printf() escreve na tela.
  printf("Digite um número: ");
  // A função scanf obtém um valor digitado.
  scanf("%d", &n);
  printf("Série de Fibonacci:\n");
  printf("%d\n", b);

  // Com a estrutura de controle for() gero a sequência.
  for(i = 0; i < n; i++)
  {
    auxiliar = a + b;
    a = b;
    b = auxiliar;

    // Imprimo o número na tela.
    printf("%d\n", auxiliar);
  }
}

Código em Java

Os números da sequência de Fibonacci podem ser gerados por uma regra (recorrência) simples:

Fibonacci(0) = 0
Fibonacci(1) = 1
Fibonacci(n) = Fibonacci(n-1) + Fibonacci(n-2)

Vejamos 4 maneiras de implementar a sequência de Fibonacci na linguagem Java. Todas as implementações criam uma classe denominada Fibonacci e um método fibo(n) do tipo long. Este método é o responsável por computar e retornar o enésimo termo da série.

IMPLEMENTAÇÃO 1 - RECURSIVA TRADICIONAL
Consiste na tradução direta da recorrência para um algoritmo recursivo. 

public class Fibonacci {

    static long fibo(int n) {
        if (n < 2) {
            return n;
        } else {
            return fibo(n - 1) + fibo(n - 2);
        }
    }

    public static void main(String[] args) {  
              
               // teste do programa. Imprime os 30 primeiros termos      
               for (int i = 0; i < 30; i++) {
            System.out.print("(" + i + "):" + Fibonacci.fibo(i) + "\t");
        }

    }

}
IMPLEMENTAÇÃO 2 - RECURSIVA UTILIZANDO O OPERADOR TERNÁRIO
Com o uso do operador ternário do Java é possível construir uma implementação bem mais compacta do método recursivo.

public class Fibonacci {

    static long fibo(int n) {
        return (n < 2) ? n : fibo(n - 1) + fibo(n - 2);
    }


    public static void main(String[] args) {
              
                // teste do programa. Imprime os 30 primeiros termos
        for (int i = 0; i < 30; i++) {
            System.out.print("(" + i + "):" + Fibonacci.fibo(i) + "\t");
        }

    }

}
IMPLEMENTAÇÃO 3 - ITERATIVA
Embora as duas implementações recursivas apresentadas sejam muito elegantes, as mesmas apresentam o problema de apresentar desempenho muito lento, pois as diversas chamadas recursivas fazem com que os mesmos valores sejam recalculados diversas vezes. Tente, por exemplo, rodar os programas recursivos para calcular fibo(50) e veja que o programa levará um longo tempo para apresentar a resposta. A seguir apresenta-se uma solução iterativa que computa o enésimo termo de uma maneira bem mais rápida.

public class Fibonacci {

    static long fibo(int n) {
        int F = 0;     // atual
        int ant = 0;   // anterior

        for (int i = 1; i <= n; i++) {

            if (i == 1) {
                F = 1;
                ant = 0;
            } else {
                F += ant;
                ant = F - ant;
            }

        }

        return F;
    }

    public static void main(String[] args) {

               // teste do programa. Imprime os 30 primeiros termos
        for (int i = 0; i < 30; i++) {
            System.out.print("(" + i + "):" + Fibonacci.fibo(i) + "\t");
        }

    }

}
IMPLEMENTAÇÃO 4 - RECURSIVA COM VETOR
Por fim, é apresentada uma implementação recursiva que consegue o mesmo desempenho da iterativa. O "truque" consiste em utilizar um vetor que armazena termos já calculados (ou seja, nesta solução recursiva nenhum termo é recalculado). Veja que a solução ficou mais complicada - foi necessário criar mais métodos e variáveis auxiliares.

public class Fibonacci {   

    private static int[] vetAux = new int[50];
    private static int k;

    public static long fibo(int n) {     
             k = 1; // inicializa k
             return recursao(n);
           }

    private static long recursao(int n) {
            if (n < 0) {
               return vetAux[0]; 
          } else {
           if (k < 3) {
              vetAux[n] = k - 1;
              k++;
           } else {
                 vetAux[n] = vetAux[n + 1] + vetAux[n + 2];
                 }
              return recursao(n - 1);
           }
    }
   
    public static void main(String[] args) {  // teste do programa. Imprime os 30 primeiros termos
    for (int i = 0; i < 30; i++) {
        System.out.print("(" + i + "):" + Fibonacci.fibo(i) + "\t");
                }
            }
        }




Triângulo de Pascal - O Código

Na minha última postagem sobre o triângulo de Pascal, mencionei alguns detalhes sobre ele. Muitos devem estar até o momento um tanto curioso quando ao seu código. 

Abaixo segue um exemplo utilizando a linguagem Pascal.

Program Pzim ;

type
  matriz = array[1..100,1..100] of integer;
var
  a : matriz;
  i, j, k, num : integer;
 Begin                                
   writeln('Entre com um número: ');
   read(num);
   for i:=1 to num do
     for j:=1 to i do
          if (j = 1) or (i = J) then
 a[i,j]:=1
else
      a[i,j]:=a[i-1,j-1] + a[i-1,j];

     clrscr;
     writeln('TRIANGULO DE PASCAL :');
     writeln('------------------------------ ');
     for i:=1 to num do
       begin
         for  j:=1 to i do
     write(a[i,j]:6);
         writeln;
       end;
     writeln;
     readkey;                                                            

 End.


Espero que tenham gostado e até a próxima

quinta-feira, 17 de abril de 2014

Triângulo de Pascal



Blaise Pascal (Clermont-Ferrand, Puy-de-Dôme, 19 de Junho de 1623 - Paris, 19 de Agosto de 1662)

Filósofo e matemático Blaise Pascal, foi um prodígio matemático.

Em torno de 1650 escreveu o "Traité du Triangle Arithmétique" publicado em 1665 e, juntamente com Pierre Fermat, estabeleceu os fundamentos da teoria da probabilidade.

Embora não tenha sido o primeiro a trabalhar com o triângulo, este tornou-se conhecido como "triângulo de Pascal" devido ao desenvolvimento e aplicações que Pascal fez de muitas de suas propriedades.

O triângulo aritmético é conhecido há muito tempo, mas recebeu o nome de 'Triângulo de Pascal' devido aos estudos que o filósofo e matemático Blaise Pascal (1623-1662) fez deste.

O triângulo é infinito e simétrico, e seus lados esquerdo e direito sempre devem possuir o número  

O triângulo ao lado, dividido em linhas e colunas, é composto de números binomiais.


Cada linha possui um número a mais que a linha anterior. Além disso, o triângulo também possui várias propriedades interessantes que permitem construir com facilidade a linha seguinte.



Este triângulo forma-se de forma recursiva, ou seja, as diagonais de fora são formadas por 1's, os restantes números são a soma dos números acima. Como exemplo podemos dizer que: 10=4+6 (10-linha 5; 4 e 6-linha 4).

NOTA: Considera-se que o topo do triângulo corresponde à linha 0, coluna 0.


Propriedades


Propriedade 1


A primeira propriedade do triângulo que iremos apresentar está relacionada à soma dos elementos de cada uma das linhas. Para ilustrar isto, vamos associar a cada linha do triângulo um número, começando do 0



A propriedade diz que a soma de todos os números de uma linha é igual a 2  elevado àquele número que associamos à linha. E o que significa isto?

Quando dizemos que o número 2 está elevado a 3 por exemplo, queremos dizer que o 2 foi multiplicado por si mesmo 3 vezes:




Você pode observar na figura o resultado das somas relacionadas à cada linha do triângulo:



Vamos conferir algumas delas:

 


Propriedade 2


A próxima propriedade do triângulo que veremos é a relação de Stifel.

Ela diz que a soma de dois números de uma mesma linha do triângulo é o número que está na linha logo abaixo, bem abaixo dos dois números somados. A figura ilustra melhor a propriedade:



Vamos verificar as somas apontadas na figura:



Propriedade 3


Nossa próxima propriedade diz respeito à soma dos números dispostos em diagonal, começando sempre do 1 a partir da direita. Observe a figura para visualizar melhor:



A soma dos números da coluna estará sempre na coluna seguinte, na linha logo abaixo daquela em que está o último número que foi somado, como mostra a figura.

Vamos conferir algumas somas:




Da mesma forma que foi feito com as propriedades anteriores, você pode continuar verificando esta! Mas tome cuidado, as somas das colunas devem começar sempre a partir do primeiro número 1 da coluna.


Propriedade 4


Nossa última propriedade é bem parecida com a anterior, só que, em vez de as somas começarem do lado direito do triângulo, desta vez devem começar do lado esquerdo:



Da mesma forma, você vai encontrar a soma desta diagonal na linha abaixo daquela em que está o último número somado. Também aqui você deve ter sempre o cuidado de começar a soma do primeiro número 1 da coluna.

Vamos verificar as somas da figura:




Soma dos Números de uma Linha

Qualquer que seja a linha de um Triângulo de Pascal, se somarmos os números nela contidos, sempre iremos obter como total uma potência de 2, cujo expoente é o próprio número da linha.

Vejamos alguns exemplos:


Números de Fibonacci nas Diagonais do Triângulo de Pascal

 Os números de Fibonacci formam uma sequência numérica infinita, onde a partir do terceiro número, os números são obtidos através da soma dos dois números anteriores.


Os dois primeiros números da sequência de Fibonacci são iguais a 1 e todos os demais números são obtidos a partir da soma dos dois números anteriores, assim temos:


1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, ...


Observe no triângulo ao lado que ao somarmos os números nas diagonais conforme mostrado, as somas obtidas vão formando a sequência de sequência de Fibonacci.


Mas, todos devem estar curioso, e o código em Pascal. Aguarde, breve irei postar.



Bibliografia




http://www.brasilescola.com/matematica/triangulo-pascal.htm

quarta-feira, 12 de março de 2014

Como pegar o maior valor de um campo no SQL SERVER


Veja como é fácil obter o maior valor de um campo inserido em uma tabela no SQL Server, utilizaremos função MAX.

SELECT MAX(campo)
FROM NOME_TABELA;