La iteración incorpora demasiados detalles innecesarios en su código, lo que hace que sea más difícil identificar lo que hace el código de un vistazo. A menudo requiere que ejecutes instrucciones mentales antes de que puedas comprender por qué son necesarios pasos individuales. No quiero tener que hacer un seguimiento de las longitudes y los contadores y los estados intermedios cuando podría usar fácilmente “y el resto” o “la suma de todos estos”, para lo cual la recursividad se presta mucho mejor.
Por ejemplo, comparemos una implementación iterativa y recursiva de un producto punto. En aras de la simplicidad, ambas implementaciones supondrán que sus argumentos tienen la misma longitud.
Usaré Python para la implementación iterativa y Haskell para la implementación recursiva.
Iterativo
def dotProduct(a, b):
total = 0
for i in range(len(a)):
total += a[i] * b[i]
return total
- ¿Las secuencias y series son importantes para el aprendizaje de algoritmos?
- ¿Por qué se utilizan montones para la asignación de memoria? ¿Por qué no se utilizan pilas ni ninguna otra?
- ¿Por qué es Forth el lenguaje de programación para practicar la escritura de algoritmos?
- Sin el uso de un generador de números aleatorios, ¿cuál es el método más complicado que se te ocurre para generar una serie de números enteros?
- ¿Existe algún vínculo en los algoritmos o técnicas de estructura de datos más utilizados en la programación competitiva?
Cuando miro esta implementación iterativa, lo que veo es:
- Escribe un total de 0.
- Determine la longitud de sus vectores y cuente hasta esta longitud: 1, comenzando desde 0.
- Con cada recuento i , examine el iésimo valor dentro de cada vector, multiplíquelos y luego agregue este producto a su total .
- Cuando haya terminado de contar hasta la longitud del vector – 1, el producto de puntos es el total que ha anotado en este punto.
Este procedimiento no me dice lo que estoy haciendo sino lo que quiere que haga . Es como construir muebles de IKEA: cada paso requiere que hagas algo específico que proporcione pocas o ninguna pista sobre la razón para hacerlo, y hasta que termines de leer todas las instrucciones para el contexto, simplemente debes confiar en que es necesario. Las ideas codificadas en forma iterativa requieren que usted vuelva a derivar el propósito de hacerlo cada vez que las lea.
Recursivo
dotProduct [] [] = 0
dotProduct (a:as) (b:bs) = a * b + dotProduct as bs
Esta implementación recursiva me dice:
- El producto escalar de dos vectores vacíos es 0.
- El producto escalar de dos vectores no vacíos es el producto de sus valores iniciales más el producto escalar de sus valores restantes.
En esa sola línea, veo toda la idea. No tengo que derivar una explicación de lo que esto hace de una lista de ajustes a las variables de estado; El código ya es una explicación de lo que es un producto punto. Y no necesita hacer uso de detalles extraños como i
s o total
s o length
s, o examinar los valores dentro de cada vector, o cualquier otra distracción para transmitirme eso.
No sirve como una analogía, pero leer código iterativo me recuerda algunas conversaciones desagradables que he tenido con el soporte técnico en las que se negaron a decirme el propósito de las instrucciones que me estaban dando:
Soporte técnico: “Veamos si su computadora se conectó a su enrutador con éxito”.
Yo: “¿Debo ver si tengo una dirección IP?”
Soporte técnico: “Entonces, haga clic en Inicio”.
Yo: “Está bien”.
Soporte técnico: “Ahora haga clic en Ejecutar”.
Yo: “Está bien. ¿Estás tratando de obtener un símbolo del sistema?”
Soporte técnico: “¿Ves un cuadro gris?”
Yo: “Sí. ¿Debo abrir un símbolo del sistema?”
Soporte técnico: “Ahora escriba: C como en Charlie, M como en Mike, D como en Delta”.
Yo: “Está bien, recibí un símbolo del sistema”.
Soporte técnico: “Ahora presione Entrar. Debería ver un cuadro negro”.
Yo: “¿Qué quieres que haga en el aviso?”
Soporte técnico: “Escriba: I como en India, P como en Peter, C como en Charlie …”
Yo: “ipconfig? ¿Quieres saber mi IP?”
Soporte técnico: “… O como en Oscar, N como en noviembre, F como en Foxtrot …”
Yo: “La dirección IPv4 en mi tarjeta inalámbrica es 192.168.1.101. También tengo una dirección IPv6, si la necesita”.
Soporte técnico: “… I como en India, y G como en Golf. Y presiona Enter”.
Yo: “…”
Soporte técnico: “Ahora busque en el texto algo que diga ‘dirección IP'”.
Yo: “Lo encontré. El IPv4 es 192.168.1.101”.
Soporte técnico: “¿Puedes encontrar el que tiene cuatro números separados por puntos?”
Yo: “¿La dirección IPv4? Sí, es 192.168.1.101”.
Soporte técnico: “Está bien, gracias”.
…y así.
(Sí, en realidad he tenido esta conversación).