Considere un viejo problema bien conocido :
En matemáticas, el máximo común divisor (mcd) ... de dos o más enteros distintos de cero, es el mayor entero positivo que divide los números sin dejar resto.
La definición de gcd es sorprendentemente simple:
donde mod es el operador de módulo (es decir, el resto después de la división de enteros).
En Inglés, esta definición dice que el máximo común divisor de cualquier número y cero es ese número, y el máximo común divisor de dos números m y n es el máximo común divisor de n y el resto después de dividir m por n .
Si desea saber por qué funciona esto, consulte el artículo de Wikipedia sobre el algoritmo euclidiano .
Calculemos gcd (10, 8) como ejemplo. Cada paso es igual al anterior:
- mcd (10, 8)
- mcd (10, 10 mod 8)
- mcd (8, 2)
- mcd (8, 8 mod 2)
- mcd (2, 0)
- 2
En el primer paso, 8 no es igual a cero, por lo que se aplica la segunda parte de la definición. 10 mod 8 = 2 porque 8 entra en 10 una vez con un resto de 2. En el paso 3, la segunda parte se aplica nuevamente, pero esta vez 8 mod 2 = 0 porque 2 divide 8 sin resto. En el paso 5, el segundo argumento es 0, por lo que la respuesta es 2.
¿Notó que aparece mcd en los lados izquierdo y derecho del signo igual? Un matemático diría que esta definición es recursiva porque la expresión que está definiendo se repite dentro de su definición.
Las definiciones recursivas tienden a ser elegantes. Por ejemplo, una definición recursiva para la suma de una lista es
sum l =
if empty(l)
return 0
else
return head(l) + sum(tail(l))
donde head
es el primer elemento de una lista y tail
es el resto de la lista. Tenga en cuenta que se sum
repite dentro de su definición al final.
Quizás prefiera el valor máximo en una 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
Puede definir la multiplicación de enteros no negativos de forma recursiva para convertirla en una serie de adiciones:
a * b =
if b = 0
return 0
else
return a + (a * (b - 1))
Si eso de transformar la multiplicación en una serie de adiciones no tiene sentido, intente expandir algunos ejemplos simples para ver cómo funciona.
El tipo de fusión tiene una definición recursiva encantadora:
sort(l) =
if empty(l) or length(l) = 1
return l
else
(left,right) = split l
return merge(sort(left), sort(right))
Las definiciones recursivas están por todas partes si sabe qué buscar. Observe cómo todas estas definiciones tienen casos base muy simples, por ejemplo , gcd (m, 0) = m. Los casos recurrentes reducen el problema para llegar a las respuestas fáciles.
Con esta comprensión, ¡ahora puede apreciar los otros algoritmos en el artículo de Wikipedia sobre la recursividad !