ʕ≧ᴥ≦ʔ Rodrigo's blog

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.

O que achou deste post? 😊😐☹️

#cte #data #database #oracle #sql #sqlserver