Gerando a sequência de Fibonacci com CTE recursivo
No artigo anterior, escrevi um post sobre o uso de common table expression (CTE) usando uma consulta recursiva.
Neste novo post mostrarei um outro exemplo de recursividade, no qual irá para gerar a sequência de Fibonacci.
A Sequência de Fibonacci, segundo a Wikipedia,
é uma sequência de números inteiros, começando normalmente por 0 e 1, na qual, cada termo subsequente corresponde à soma dos dois anteriores. A sequência recebeu o nome do matemático italiano Leonardo de Pisa, mais conhecido por Fibonacci, que descreveu, no ano de 1202, o crescimento de uma população de coelhos, a partir desta. Esta sequência já era, no entanto, conhecida na antiguidade.
A sequência de Fibonacci é composta pelos números: 0,1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, … onde o próximo número da sequência é a soma dos dois números anteriores. É representada, matematicamente, pela fórmula recursiva abaixo:
Fn = Fn-1 + Fn-2
Para fins didáticos, podemos gerar a sequência utilizando CTE recursivo, como mostrado no exemplo abaixo:
WITH sequencia_fibonacci(fibonacci_nro, proximo_nro) AS (
-- consulta âncora
SELECT 0, 1
UNION ALL
-- consulta recursiva
SELECT proximo_nro, fibonacci_nro = fibonacci_nro + proximo_nro
FROM sequencia_fibonacci
WHERE fibonacci_nro < 100
)
SELECT fibonacci_nro FROM sequencia_fibonacci;
Para que uma consulta CTE seja considerada recursiva, ela deve conter pelo menos duas definições de consulta: uma consulta âncora e uma consulta recursiva.
No exemplo acima, a consulta âncora é SELECT 0, 1, na qual é definido os valores 0 e 1 como os primeiros valores da sequência, respectivamente. A consulta âncora é combinada com a consulta recursiva pela operador UNION ALL, a qual referencia à CTE sequencia_fibonacci pela claúsula FROM. Como condição de parada do loop recursivo, limitamos a sequência para retornar apenas os valores menores que 100. Por fim, selecionamos apenas o valor fibonacci_nro para retornar os valores da sequência.
I know it is only SQL but I like.