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!

Anúncios

Microsoft Community Contributor

Olá,

Ontem recebi um email informando que fui nomeado na premiação de Microsoft Community Contributor. Foi surpresa geral!

Fiquei feliz pra caramba de saber que minhas contribuições (não muitas, é verdade) foram de valia para alguém e que estas contribuições geraram este reconhecimento. Isso só me deixou mais animado para contribuir mais e mais com a comunidade Microsoft, em especial com a comunidade de SQL Server, com o qual trabalho e me divirto muito.

O reconhecimento é só uma consequência natural do trabalho realizado, mesmo estando muito orgulhoso de tê-lo recebido. Estou com a sensação de “missão cumprida!”. Muito bom!

Minha missão agora é colocar o blog aqui em ordem, procurar ter mais frequência em meus posts, compartilhando mais informação e conhecimento e continuar participando dos fóruns technet e msdn.

Vamos em frente!

Abraços!