Un aporte algorítmico al “debate” cero a la cero

Agosto 7, 2009

Es curioso (y en cierto modo injusto) el hecho de que la igualdad 0^0 = 1 sea tan discutida en ciertos ámbitos.

No niego que este resultado pueda ser poco intuitivo al principio, sobre todo si primero nos enseñan que 0^n = 0 para n > 0, pero una vez que se demuestra, resulta de lo más natural en innumerables contextos.

Se pueden dar demostraciones de todo tipo (por ejemplo, la del Topo Lógico, basada en la teoría de conjuntos, es de las más lindas que vi); pero como yo soy menos riguroso y me gustan las computadoras, se me ocurrió darle al asunto un enfoque más orientado hacia la “elegancia algorítmica” (sea eso lo que sea).

Idea básica: aplicación iterada

Supongamos que necesitamos una función que tome dos números naturales y calcule su producto, usando la definición de producto como acumulación de sumas. Una manera iterativa de implementarla será algo así (en Python):

def producto(x, y):
    # comenzamos con el elemento neutro de la suma
    t = 0
    # ahora aplicamos y veces el sumando x
    for i in range(y):
        t += x
    return t

Y una manera recursiva, en Haskell por ejemplo:

producto x 0 = 0
producto x y = x + (producto x (y-1))

Aunque quizá no sean tremendamente eficientes, ambas funcionan perfectamente en todos los casos, e ilustran la definición del producto como aplicación repetida de la suma.

Extendiendo la idea

Supongamos que ahora nos piden que definamos la potencia de dos números naturales, usando la misma idea de acumulación, aunque ahora de productos en lugar de sumas.
Un programador que se precie usará el mismo patrón que antes, pero cambiando la operación aplicada y el elemento neutro.

La versión iterativa quedaría entonces así:

def potencia(x, y):
    # comenzamos con el elemento neutro de la multiplicacion
    t = 1
    # ahora aplicamos y veces el factor x
    for i in range(y):
        t *= x
    return t

Y la versión recursiva, así:

potencia x 0 = 1
potencia x y = x * (potencia x (y-1))

Y ambas dan la respuesta correcta para 0^0.

¿No es bello? Además de haber ahorrado trabajo aplicando un patrón ya implementado, se logra la capacidad para definir funciones cada vez más “avanzadas”, cada una extendiendo un nivel la función anterior. Pero ese es tema para otro post…


Día de la Recursión

Agosto 1, 2009

He aquí una grata noticia: en Juegos de Ingenio se está llevando a cabo una encuesta para decidir qué día del año debe ser el Día de la Recursión (hasta ahora, una vacío imperdonable en el calendario acertijero mundial).

La iniciativa está orientada a organizar una muestra colectiva que refleje las variadas formas en que se manifiesta la recursión en el mundo lúdico y artístico.

En una primera etapa, toda la comunidad lúdica está invitada a proponer la fecha más adecuada. Para impulsar un candidato sólo hay que completar el siguiente formulario y enviarlo a esta direccion.

Fecha propuesta para el Día de la Recursión (día/mes): ___/___
Motivo de su elección: ________________


Feriados

Junio 16, 2009

Si algún día llego a tener algún cargo legislativo (cosa que dudo) mi primer proyecto de ley será declarar feriado el primer día hábil del año.

Seguramente duraré poco como legislador…


La belleza algorítmica de las plantas

Mayo 29, 2009

Tal es el título de un libro que estoy leyendo en estos días. Se puede conseguir gratuitamente en este sitio (en formato pdf).

El libro describe técnicas de modelado matemático de muchas estructuras que aparecen en el mundo vegetal. Todas son interesantes y muchas son muy fáciles de implementar, con algoritmos elegantes y breves (yo mismo he encontrado muy sencillo implementar una variante en mi programejo garabatos).

La existencia de estos modelos es muy evocativa y sugiere que la aparición de estructuras complejas no requiere de fuerzas misteriosas o leyes complicadas, sino de la aplicación reiterada de reglas sencillas a una cantidad muy pequeña de información inicial.

Recomiendo el libro a todos aquellos que amen las plantas y/o la matemática, y a los que estén interesados en la visión computacional del universo.


Meta-deseo

Diciembre 3, 2008

Gabriel Castelán, de la ciudad de México, me envía esta foto de un aviso publicitario bastante bucloso:

Lo único que quiero es que sepas lo que quiero.

Quizá lo diseñó alguien que piensa que las mujeres no saben lo que quieren. Pero en realidad es bastante explícito; el hecho de que la recursión que sugiere no tenga caso base no significa que no pueda evaluarse. Seguramente requerirá un poco de paciencia y mucha empatía. Quizá el amor no sea otra cosa.


MiniMax

Noviembre 28, 2008

MiniMax es el pintoresco nombre del algoritmo usado en muchos sistemas de análisis o simulación de juegos bipersonales.

Su funcionamiento emula el pequeño bucle recursivo que se genera a veces en las mentes de los jugadores, cuando no hay atajos para conocer la jugada óptima:

“Él va a hacer la la jugada A porque piensa que yo voy a hacer la jugada B porque pienso que él va a hacer la jugada C porque piensa que…”

Claro que los detalles son más escabrosos: hay que intercambiar roles en cada paso, evitar recursiones infinitas, usar poca memoria, etc; pero la idea básica es realmente encantadora, y más aún cuando uno ve que realmente funciona.


Meta-creyentes

Septiembre 26, 2008

Llamemos creyentes a aquellos que creen que existe dios (sea eso lo que fuere), y además creen que dios creó todo lo que existe.

Ante la inmediata pregunta “Y entonces, ¿qué o quién creó a dios?” suelen encogerse de hombros, o pensar que es peligroso inmiscuirse en esos asuntos, o hundirse en falacias lógicas.

Ahora bien, también existen los meta-creyentes. Estas personas creen que hay un meta-dios que creó a dios, un meta-meta-dios que creó al meta-dios, y así sucesivamente en una cadena infinita.
A pesar de no compartirla, esta idea me cae mucho más simpática.

Claro que se podría preguntar “¿Qué o quién creó la cadena infinita de dioses?”, y en seguida surgirían los omega-creyentes que explicarían que un omega-dios creó la cadena infinita, etc…

Creo que es mucho más sencillo ser ateo.


Sitio propio para Robotín

Septiembre 24, 2008

Para no polucionar Bucles con el tema, hice una paginita para Robotín. Pasen por aquí.


Robotín: versión casera del Light Bot

Septiembre 23, 2008

He aquí la versión pre-pre-alpha de Robotín. Los que quieran probar la versión para windows no tienen más que bajarla desde este link. Cuando pueda compilaré la versión para Linux.

Envíen sugerencias y/o niveles nuevos (es fácil crearlos).


Light Bot

Septiembre 19, 2008

Ayer me recomendaron un juego realmente notable: el Light Bot.

El objetivo del juego es lograr que un robotito recorra su entorno, encendiendo algunas de las baldosas por las cuales camina. Para ello disponemos de acceso a la memoria del robot, pudiendo almacenar allí las instrucciones que lo harán moverse, girar, saltar y encender o apagar las baldosas.

Lo desafiante del juego es que el robot tiene muy poca memoria: 28 instrucciones en total, divididas en 12 principales y dos grupos de 8 para definir dos funciones o subrutinas.

Esta parquedad hace que, tras unos cuantos niveles, tengamos que recurrir a la recursión (chiste no intencional) para ganar, lo cual me pareció realmente delicioso.