Considere um problema antigo e bem conhecido :
Em matemática, o maior divisor comum (MDC) ... de dois ou mais números inteiros diferentes de zero, é o maior número inteiro positivo que divide os números sem deixar resto.
A definição de gcd é surpreendentemente simples:
onde mod é o operador modulo (ou seja, o restante após a divisão inteira).
Em inglês, essa definição diz que o maior divisor comum de qualquer número e zero é esse número, e o maior divisor comum de dois números m e n é o maior divisor comum de n e o restante depois de dividir m por n .
Se você quiser saber por que isso funciona, consulte o artigo da Wikipedia sobre o algoritmo euclidiano .
Vamos calcular o gcd (10, 8) como um exemplo. Cada passo é igual ao anterior:
- mcd (10, 8)
- mcd (10, 10 mod 8)
- mcd (8, 2)
- mcd (8, 8 mod 2)
- mcd (2, 0)
- 2
Na primeira etapa, 8 não é igual a zero; portanto, a segunda parte da definição se aplica. 10 mod 8 = 2 porque 8 entra em 10 uma vez com o restante 2. Na etapa 3, a segunda parte se aplica novamente, mas desta vez 8 mod 2 = 0 porque 2 divide 8 sem o restante. Na etapa 5, o segundo argumento é 0, então a resposta é 2.
Você notou que o mcd aparece nos lados esquerdo e direito do sinal de igual? Um matemático diria que essa definição é recursiva porque a expressão que você está definindo se repete dentro da definição.
Definições recursivas tendem a ser elegantes. Por exemplo, uma definição recursiva para a soma de uma lista é
sum l =
if empty(l)
return 0
else
return head(l) + sum(tail(l))
onde head
é o primeiro elemento de uma lista e tail
o restante da lista. Observe que se sum
repete dentro de sua definição no final.
Talvez você prefira o valor máximo em uma lista:
max l =
if empty(l)
error
elsif length(l) = 1
return head(l)
else
tailmax = max(tail(l))
if head(l) > tailmax
return head(l)
else
return tailmax
Você pode definir a multiplicação de números inteiros não negativos recursivamente para transformá-lo em uma série de adições:
a * b =
if b = 0
return 0
else
return a + (a * (b - 1))
Se esse pouco sobre transformar a multiplicação em uma série de adições não fizer sentido, tente expandir alguns exemplos simples para ver como funciona.
A classificação de mesclagem tem uma definição recursiva adorável:
sort(l) =
if empty(l) or length(l) = 1
return l
else
(left,right) = split l
return merge(sort(left), sort(right))
Definições recursivas estão por toda parte, se você souber o que procurar. Observe como todas essas definições têm casos base muito simples, por exemplo , gcd (m, 0) = m. Os casos recursivos diminuem o problema para chegar às respostas fáceis.
Com esse entendimento, agora você pode apreciar os outros algoritmos no artigo da Wikipedia sobre recursão !