C# - Sequência de Fibonacci
No artigo de hoje veremos como calcular a sequência de Fibonacci. |
Tudo começou com Leonardo de Pisa (Fibonacci=filius Bonacci=filho
de Bonacci)
matemático e comerciante da idade média, que em 1202 publicou um livro -
Liber Abbaci - onde descreveu o crescimento de uma população de
coelhos , que viria trazer o conhecimento ao mundo ocidental dos números e
seqüência que ficou conhecida como números de Fibonacci.
Mas quais seriam esses números e
como obtê-los ? Olhe com atenção a seqüência de números abaixo: F = 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89,144, 233, ...
Repare que, exceto para os dois primeiros termos (1 e 1 ), todos os outros podem ser calculados iterativamente a partir da soma dos dois termos imediatamente anteriores. |
Assim o algoritmo para obter um número de Fibonacci pode ser expresso da seguinte forma:
M(1) = 1;
M(2) = 1;
M(n) = M(n-1) + M(n-2), para n > 2
Criando a sequência de Fibonacci
Um código C# bem simples para calcular a sequência de Fibonacci pode ser visto a seguir:
int elementoAtual = 0;
int proximoElemento = 1;
Console.WriteLine("\nSequência de Fibonacci");
Console.WriteLine("\nNúmero de elementos : \n");
var numeroElementos = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Elemento atual : 0 ");
Console.WriteLine("Próximo Elemento : 1 ");
Console.WriteLine();
for (int i = 2; i <= numeroElementos; i++)
{
int soma = elementoAtual + proximoElemento;
Console.Write(soma + " ");
elementoAtual = proximoElemento;
proximoElemento = soma;
}
Console.ReadLine();
|
Neste programa, usamos NumeroElementos para representar o número total de elementos que queremos imprimir na série de Fibonacci. Usamos elementoAtual e proximoElemento para representar os elementos atuais e próximos da série, respectivamente.
Em seguida, usamos um loop for para iterar sobre os elementos restantes na série e calcular cada elemento adicionando os dois elementos anteriores, e, a seguir imprimimos cada elemento à medida que o calculamos usando o método Console.Write().
Por fim, atualizamos os valores de elementoAtual e proximoElemento para a próxima iteração do loop.
A forma mais simplificada deste código poderia ser feita da seguinte forma:
Console.Write("Digite o número de termos que deseja gerar
na sequência de Fibonacci: ");
int n = int.Parse(Console.ReadLine());
int a = 0;
int b = 1;
for (int i = 0; i < n; i++)
{
Console.Write("{0} ", a);
int temp = a;
a = b;
b = temp + b;
}
Console.ReadLine();
|
Podemos escrever um código para gerar a sequência de Fibonacci usando a recursividade da seguinte forma:
Console.WriteLine("\nSequência de Fibonacci");
Console.WriteLine("\nNúmero de elementos : \n");
var numeroElementos = Convert.ToInt32(Console.ReadLine());
Console.Write($"\nA série de Fibonacci com {numeroElementos} termos é : \n\n");
for (int i = 0; i < numeroElementos; i++)
{
Console.Write(Fibonacci(i) + " ");
}
Console.ReadKey();
static int Fibonacci(int n)
{
if (n <= 1)
{
return n;
}
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
|
Para imprimir a série de Fibonacci até um determinado número em C# usando a abordagem baseada em um loop, podemos iterar pela sequência e imprimir cada número até atingirmos o valor desejado.
Console.Write("\nImprimir a sequêcia de Fibonacci até o número : ");
int numeroElementos = Convert.ToInt32(Console.ReadLine());
PrintFibonacci(numeroElementos);
Console.ReadKey();
static void PrintFibonacci(int n)
{
int anterior = 0;
int atual = 1;
while (atual <= n)
{
Console.Write(atual + " ");
int proximo = anterior + atual;
anterior = atual;
atual = proximo;
}
}
|
Calcular o n-ésimo número de Fibonacci não é difícil, basta chegar ao valor com o índice correto.
Vamos primeiro dar uma olhada em uma abordagem iterativa. Aqui estamos usando um array de inteiros para manter os números de Fibonacci até n e retornando o enésimo número de Fibonacci.
Console.Write("Para qual número da sequência deseja obter o número : ");
int numeroSequencia = int.Parse(Console.ReadLine());
var resultado = GetNumeroFibonacciParaNumero(numeroSequencia);
Console.WriteLine($"O valor para este termo é : {resultado}");
Console.ReadKey();
static int GetNumeroFibonacciParaNumero(int n)
{
int numero = n - 1;
int[] Fib = new int[numero + 1];
Fib[0] = 0;
Fib[1] = 1;
for (int i = 2; i <= numero; i++)
{
Fib[i] = Fib[i - 2] + Fib[i - 1];
}
return Fib[numero];
}
|
Outra possibilidade seria usar o código abaixo para obter o valor de um termo da sequência :
static void GetValorTermo(int n)
{
int a = 0;
int b = 1;
if (n == 1)
{
Console.WriteLine(a);
}
else if (n == 2)
{
Console.WriteLine(b);
}
else
{
for (int i = 3; i <= n; i++)
{
int c = a + b;
a = b;
b = c;
}
Console.WriteLine(b);
}
}
|
Podemos assim ter diversas implementações para calcular a sequência de Fibonacci e suas variações.
E estamos conversados...
Referências:
NET - Unit of Work - Padrão Unidade de ...