Recursividade e funções

Olá,

Esses dias fui submetido a um teste em que tive que responder à seguinte pergunta: Dado um número x de pessoas, quantas vezes estas pessoas irão se cumprimentar entre si? A imagem abaixo deixa claro a situação.

Cinco pessoas se encontram. Quantos cumprimentos eles farão? (Considerando que não vão haver repetições nos cumprimentos).

Vamos iniciar a contagem por uma das pessoas e seguir em sentido horário. Veja abaixo:

A primeira pessoa, conforme o esperado, cumprimenta as outras 4. Ao passar para a segunda pessoa, ela não irá cumprimentar novamente a primeira uma vez que já se cumprimentaram. Logo, a seu sequência fica assim:

Seguinte esta linha de raciocínio, percebe-se uma lógica na quantidade de cumprimentos realizados. A primeira pessoa realizou 4 cumprimentos, que em outras palavras é a quantidade de pessoas (@elements) menos 1. A segunda pessoa realizou 3 cumprimentos, ou seja, @elements – 2, e esta lógica é seguida até o final onde todos se cumprimentam.

Observando a solução do problema percebi que existe uma recursividade acontecendo. Dito isto, montei a função abaixo que realiza a chamada dela mesma para retornar a quantidade total de cumprimentos realizados.

CREATE FUNCTION Fn_Combinatoria(@elements int)
RETURNS int
AS
BEGIN
DECLARE @n INT
SET @n = 0
 IF @elements > 0
SELECT @n = dbo.Fn_Combinatoria( @elements-1 ) + @elements-1

RETURN @n
END
GO

A recursividade está no fato da função realizar uma chamada a ela mesma. Observem que vi a necessidade de colocar uma validação (IF @elements > 0) para evitar um loop infinito na função, gerando o erro:

Msg 217, Level 16, State 1, Line 1
Maximum stored procedure, function, trigger, or view nesting level exceeded (limit 32).

Enfim, com base em um teste identifiquei um exemplo simples e didático para explicar como funciona a recursividade e consegui demonstrar utilizando uma função dentro do SQL Server.

É isso.

Abraços!

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s