LOGO Y EL CICLO RECURSIVO – FORMANDO LAZOS

RECURSIVIDAD = RECURRENCIA

El término recursividad utilizada en programación deriva de la palabra “recurrencia”, es decir la acción de repetir una misma acción. Efectivamente la recursividad es la repetición de un conjunto de acciones definidas en un procedimiento. Suele asimilarse con el término “loop” o “lazo” o “ciclo” y aunque si bien es un “loop” en Logo tiene otras propiedades que le dan un poder que se utiliza en “programación avanzada” y que describiremos en este artículo.

Como Logo define los procedimientos con un nombre, la recursividad se obtiene incluyendo el nombre del procedimiento en el código del procedimiento antes del comando FIN. Esta propiedad de que un procedimiento se “llame” a sí mismo para perpetuarse tiene links filosóficos, biológicos y cosmológicos, ya que podemos asimilarlo a un “ente” que en su código genético tiene la potencialidad de recrearse a sí mismo y aspirar a la eternidad. También se asemeja a un juego borgiano de espejos que se reflejan a sí mismos creando imágenes que se reproducen hasta el infinito.

Cubo especular

Cubo especular

ESQUEMA DE UNA RECURSIÓN

El esquema general de un procedimiento recursivo sería:

Esquema general

PARA PROCEDIMIENTO_NOMBRE
ACCIONES DEL PROCEDIMIENTO
PROCEDIMIENTO_NOMBRE
FIN

Ejemplo

PARA ANÁFORA
ES [Menos tu vientre … ]
ESPERA 10
ANÁFORA
FIN

Donde la línea anterior al FIN, en rojo, es la “línea recursiva”.

Los procedimientos recursivos aplicados a los gráficos de tortuga producen efectos siempre interesantes y sorprendentes, y es que la recursividad, en definitiva provoca una repetición, y la repetición crea un patrón, y el patrón conforma una “estructura” y el cerebro ama las estructuras. Por ejemplo, cualquier combinación de avances y giros de tortuga, cuya resultante no sea nula y cuya sumatoria de giros sea diferente a 0 o 180º generará una estructura circular.

RECURSIÓN INFINITA Y FINITA

Una recursión puede ser infinita cuando la recurrencia no tiene fin o finita si puede introducirse una regla para limitar el número de repeticiones.

RECURSIÓN INFINITA

PARA MRU
AV 10
ESPERA 1
MRU
FIN

RECURSIÓN FINITA

PARA MRUA :A
SI :A > 100 [ALTO]
AV :A
GD 12 ESPERA 2
MRUA :A + 0.5
FIN

HERÁCLITO Y EL LOGOS

“Este cosmos, que es el mismo para todos, no ha sido hecho por ninguno de los dioses ni de los hombres, sino que siempre fue, es y será un fuego eterno y vivo que se enciende y se apaga obedeciendo a medida”.

Heráclito

Heráclito fue un pensador griego nacido en Éfeso en el siglo V A.C. Conocido como “el oscuro” su pensamiento se conoce por la obra de autores posteriores. Ha sido iconizado como el filósofo del “devenir”, “Cambia, todo cambia” cantaría hoy Heráclito. Que el cosmos sea fuego eterno y vivo, significa que está en constante transformación y destrucción, pero ese cambio se realiza “según medida”, es decir siguiendo una ley, un patrón, que los griegos llamaron Logos. El Logos es lo que hace en definitiva comprensible y racionalizable la realidad.

Entre los programas recursivos, los generadores de espirales, son los más conocidos y combinan los gráficos de tortuga, con programas con variables, recursión con variación en serie y reglas de control. La introducción del azar crea estructuras variables donde no es sencillo encontrar un patrón, pero aun en esos casos el programador conoce la ley, el Logos que gobierna el cambio (que no es otra cosa que el procedimiento). Lo que visualmente parece caótico está generado por un procedimiento, un Logos que determina también el caos. En esta premisa se basa toda la ciencia, en que el Cosmos puede ser conocido por la mente y que en definitiva el Cosmos (orden) surgió del Caos.

COSMOS Y CAOS GENERADOS POR EL LOGOS

COSMOS Y CAOS GENERADOS POR EL LOGOS

FANTASMAS EN LA RAM

La recursión tiene un efecto curioso, cuya necesidad ignoro pero debe estar relacionada con la forma que el Logo gestiona la memoria. Ese efecto radica en que cada recurrencia del procedimiento queda grabada en memoria. Recuerdo que en las antiguas Commodore 64, las recursiones sufrían una pausa durante la cual se efectuaba una “recolección de basura” (garbage collection), acción que liberaba la memoria de los “fantasmas” almacenados que no eran necesarios. Incluso tenía un comando llamado Recicla, que forzaba la recolección y que permitía al programador que ésta se produjese en un momento deseado y no durante una acción durante la cual era inconveniente una “pausa”. Claro que estamos hablando de una máquina que tenía apenas 64 Kb de memoria. No se percibe ahora ese fenómeno, aunque no sé si es porque Logo ha cambiado la gestión de la memoria o porque la memoria es mucho más grande.

Como es de público conocimiento un FANTASMA se produce cuando la persona que muere tiene “deudas pendientes” :=), por lo tanto podemos visualizar este efecto de sembrado de “fantasmas” en la RAM si colocamos entre la línea recursiva y el FIN del procedimiento, al menos 1 línea de código.

Tomemos un caso sencillo.

Procedimiento recursivo

PARA CUENTA_3 :NUM
SI :NUM > 3 [ES [DONE] ALTO]
ES :NUM
CUENTA_3 :NUM + 1
FIN

Si ordenamos ahora CUENTA_3 1
1
2
3
DONE

Pero si entre la línea recursiva y el FIN escribimos

Procedimiento con fantasmas

PARA CUENTA_3 :NUM
SI :NUM > 3 [ES [DONE] ALTO]
ES :NUM
CUENTA_3 :NUM + 1
ES :NUM
FIN

Si ordenamos ahora CUENTA_3 1

1
2
3
DONE
3
2
1

La sentencia “fantasma” (en azul) no se ejecuta en el momento porque la línea recursiva lo impide, pero queda como una “orden pendiente” almacenada en RAM. Cuando la recursión llega a :NUM > 3, escribe la palabra [DONE] y antes de detenerse ejecuta todas las “órdenes pendientes” (fantasmitas). Veamos en el siguiente esquema lo que sucede paso a paso en función del valor de la variable :NUM

Valor de :NUM

Orden cumplida

Orden pendiente

1
2
3
4
1
2
3
DONE (ALTO)
ES 1
ES 2
ES 3
Se ejecutan las órdenes pendientes
3
2
1

APLICACIÓN DE LOS FANTASMAS

Utilizar esta propiedad de la recursión, tiene aplicaciones poderosas, al punto que recibe el nombre de “recursión avanzada”. Sería sencillo comprender un procedimiento que haga y deshaga, por ejemplo:

PARA ESPIRAL :AV :ANG
SI :AV > 300 [LAPIZINVIERTE ALTO]
AV :AV
GD :ANG
ESPERA 2
ESPIRAL :AV + 10 :ANG
GI :ANG
RE :AV
ESPERA 2
FIN

Las líneas fantasmas (en azul) pasarían por encima de la espiral borrando cada avance. Este programa de recursión avanzada, nos permitiría ver el nacimiento, desarrollo y extinción de la criatura espiral.

RECURSIVIDAD Y FRACTALES

La resolución de fractales es una de las aplicaciones más espectaculares de la recursión avanzada. ¿Qué es un “fractal”? El siguiente texto está extraído de la página http://www.fractovia.org/art/es/what_es1.shtml

Un fractal es un objeto que exhibe recursividad, o autosimilitud, a cualquier escala. En otras palabras, si enfocamos una porción cualquiera de un objeto fractal (imaginemos que utilizamos un magnificador, o hasta un microscopio, para ello), notaremos que tal sección resulta ser una réplica a menor escala de la figura principal.

Otro aspecto importante sobre los fractales es que su dimensión es fraccionaria. Es decir, en vez de ser unidimensional, bidimensional o tridimensional (como es el para los objetos que nos son más familiares), la dimensión en la mayoría de los fractales no se ajusta a dichos conceptos tradicionales. Más aún, su valor raramente puede ser expresado con un número entero. Esto es, precisamente, lo que les ha dado su nombre.

Probablemente, el primer objeto fractal puro en la historia, el polvo de Cantor, fue descrito por el matemático alemán Georg Cantor-inventor de la teoría de los conjuntos-alrededor de 1872. A pesar de ser una figura extremadamente sencilla, recoge todos los atributos discutidos sobre los fractales hasta el momento: presenta autosimilitud a cualquier escala y su dimensión es fraccionaria, con valor aproximado de 0,630929753571457437099527114 (log 2/log 3,si utilizamos una expresión más adecuada). Igualmente, podemos basarnos en él para introducir otra característica general de este tipo de objeto: son producidos por procesos de iteración.

La iteración puede describirse como un mecanismo de retroalimentación, que se repite un número n de veces. Esto se refiere, por ejemplo, al acto de utilizar un valor inicial en el cálculo de cierta función, y luego tomar el producto, o resultado, como valor inicial para el próximo cálculo de esa misma función. Dicha operación puede repetirse indefinidamente (incluso infinitamente), produciendo una iteración. Cualquier proceso semejante tendrá como resultado un fractal.

El polvo de Cantor se inicia con un segmento lineal (justamente, conocido como el iniciador); éste se divide en tres segmentos menores de la misma longitud, el central de los cuales se extrae. Este proceso (denominado, usualmente, como el generador) se repite indefinidamente, al final de lo cual-si tiene final- se habrá producido el polvo de Cantor.

Fractal de Cantor

Fractal de Cantor

Debo confesar que el tema de la “dimensión fractal” es algo que elude mi comprensión cabal, al menos por el momento, Leo en otra página una de las razones de mi dificultad: La medición de formas fractales (fronteras, poligonales, etc,) ha obligado a introducir conceptos nuevos que van más allá de los conceptos geométricos clásicos.

“Dado que un fractal está constituido por elementos cada vez más pequeños, el concepto de longitud no está claramente definido: Cuando se quiere medir una linea fractal con una unidad, o con un instrumento de medida determinado, siempre habrá objetos más finos que escaparán a la sensibilidad de la regla o el instrumento utilizado, y también a medida que aumenta la sensibilidad del instrumento aumenta la longitud de la línea.

Esto sucede con la curva de Koch. Cada paso en la génesis de la curva aumenta un tercio su longitud. Es decir la longitud de la curva que ocupa el espacio inicial va aumentando en cada paso su longitud de forma indefinida. Cada curva es 4/3 de la anterior.

LA CURVA DE KOCH

Creo que fue el primer fractal que vi en mi vida, allá por 1983, en una de las presentaciones del Primer Congreso Internacional Logo, un evento extraordinario que cumple 30 años y al que me dedicaré en algún momento. En la curva de Koch puede apreciarse bien el concepto de fractal. El procedimiento Logo adaptado para el FMS LOGO es:

para koch :n :l
si :n= 0 [av :l alto]

koch :n – 1 :l / 3

gi 60

koch :n – 1 :l / 3

gd 120

koch :n – 1 :l / 3

gi 60

koch :n – 1 :l / 3

fin

Las líneas de accionamiento son los 3 giros y el avance de la longitud fractal, se hará cuando el n (nivel de fraccionamiento) sea 0, o sea al cierre de cada recursión.

Si ejecutamos koch 300 0, la tortuga graficará una línea recta de longitud = 300. En este caso L = lf

El procedimiento tiene 4 líneas recursivas, una por cada división de la línea recta inicial.

Cada recursión disminuye 1 el nivel de fraccionamiento y en 1/3 la longitud del avance.

En el caso koch 300 1, la figura es la que se ve abajo. Como vemos cada línea se divide en 4 segmentos iguales cuya longitud es 1/3 L.

La longitud de la curva fractal (lf) es entonces = 4/3 L .

Recursivamente para cada n, lf(n) = 4/3 lf(n -1)

kochnivel01

Lf (N=1) = L

Lf (N=1) = (L/3) . 4

Lf (N=2) = ((L/3) / 3) . 4 . 4

Lf (N=3) = (((L/3) / 3) / 3) . 4 . 4. 4

Lf (N=4) = ((((L/3) / 3) / 3) / 3) . 4 . 4. 4.4

En general será entonces para un nivel n

Lf (n) = (L / 3 n). 4 n

Lf (n) = L .(4/3) n

En el caso de L = 500, entonces: Lf (7) = 500 .(4/3)7 = 3745.77 (valor aproximado a 2 decimales)

Podemos pedirle a la tortuga que resuelva el valor de la Longitud fractal. modificando el procedimiento para que acumule el valor de cada avance en la variable local :long, definida en el procedimiento longitud. El procedimiento longkoch graficará la curva entre n = 1 y n = 7 y acumulará los valores de :long en la variable local :lista. El color es una función del nivel. Además rotulará el nivel de la curva antes de graficarla y el valor de la longitud fractal al terminar.

para koch :n :l
si :n= 0 [av :l make “long :long + :l alto]
koch :n – 1 :l / 3
gi 60
koch :n – 1 :l / 3
gd 120
koch :n – 1 :l / 3
gi 60
koch :n – 1 :l / 3
fin

para longitud
make “long 0
make “lista []
bp
sl ponpos [-250 290]
longkoch 1
fin

para longkoch :n
si :n = 8 [alto]
sl ponx -250 pony coory – 88 ponrumbo 90
bl
rotulo :n
poncl :n
koch :n 500
sl av 20 rotulo formatonumero :long 7 2
make “lista frase :lista formatonumero :long 7 2
make “long 0
longkoch :n + 1
fin

kochfractales

Como vemos el valor determinado para el nivel 7 es 3745.77 es similar al valor hallado analíticamente.

Cuando n -> ∞, la longitud fractal también, aunque el espacio L se mantiente constante. La superficie contenida por la curva “infinita” es finita.

Como la longitud de la linea fractal depende de la longitud de instrumento, o de la unidad de medida que tomemos, la noción de longitud en estos casos, carece de sentido. Para ello se ha ideado otro concepto: el de dimensión fractal. Que en el caso de las líneas fractales nos va a indicar de qué forma o en que medida una linea fractal llena una porción de plano. Y que además sea una generalización de la dimensión euclidea.

Sabemos que en geometría clásica un segmento tiene dimensión uno, un círculo tiene dimensión dos, y una esfera tiene dimensión tres. Para que sea coherente con lo dicho una línea fractal tiene que tener dimensión menor que dos (no llena toda la porción de plano). Y en los casos del conjunto de Cantor y de la curva de Koch menor y mayor que uno respectivamente: En el primer caso no llena todo el segmento de recta, y en el segundo es más largo. Sin embargo el caso del conjunto de Cantor es excepcional y no se puede considerar propiamente un fractal, en general lo que sucede es que la longitud de la curva fractal es superior al del segmento de recta que lo genera, y por tanto en general la dimensión fractal será un número comprendido entre uno y dos.

EL COPO DE KOCH

Podríamos “intervenir” o ampliar la curva de Koch. por ejemplo el clásivo COPO de KOCH que no es más que un triángulo equilátero que utiliza la curva como lado.

para copo_koch :n :l
repite 3 [koch :n :l gd 120]
fin

COPO_KOCH 3 600

COPO_KOCH 3 600

COPO_KOCH 8 600

COPO_KOCH 8 600

ESCARAPELA DE KOCH 8 600

ESCARAPELA DE KOCH 8 600

Haciendo unos retoques en el procedimiento

para koch2 :n :l
si :n= 0 [av :l alto]
koch2 :n – 1 :l / 3
gi 60
koch2 :n – 1 :l / 4
gd 120
koch2 :n – 1 :l / 3
gi 60
koch2 :n – 1 :l / 4
fin

Y ordenando REPITE 2 [koch2 6 100 gd 180] , obtenemos el perfil de la isla Margarita :=) (intervenida con Photoshop). Esta es una de las aplicaciones de los fractales, representar contornos de la naturaleza que no pueden reducirse a figuras geométricas convencionales.

ISLA de KOCH

ARBOL ¿FRACTAL?

También fue presentado en el Primer Congreso Internacional Logo, Pero aunque su resolució en Logo utiliza la técnica de recursión avanzada, recursiones dentro de una recursión, y la generación de figuras idénticas que disminuyen su tamaño, no estoy seguro ahora que sea un fractal, al menos no del mismo tipo que la curva de Koch, pues la división (fraccionamiento) no se realiza en un espacio constante L sino que aumenta con el nivel de fracción. Este es un árbol simétrico de nivel 8.

ÁRBOL NIVEL FRACTAL = 8

ÁRBOL NIVEL FRACTAL = 8

La figura iniciadora de este fractal sería una línea (el tronco) correspondiente al NIVEL 1, Pero para entender el proceso de división observemos el nivel 2. Del tronco salen 2 ramas con una disminución porcentual de longitud determinada por una variable constante. A su vez, en el nivel 3, de cada rama saldrán 2 ramas y así sucesivamente.

arbolnivshort_200_07_30 1y2

El procedimiento correspondiente es:

PARA ARBOL :niv :largo :escala :angu

si :niv = 0 [alto]

av :largo

gd :angu

ARBOL :niv – 1 :largo*:escala :escala :angu

gi 2 * :angu

ARBOL :niv – 1 :largo*:escala :escala :angu

gd :angu

re :largo

FIN

Tiene 4 inputs

:niv es el nivel de división fractal, la cantidad de ramas incluido el tronco.Va disminuyendo en 1 y es el input de control, ya que cuando llega a 0 se detiene la recursión.

:largo es la longitud del tronco. Se va modificando con la escala, que en los ejemplos anteriores es menor a 1 y por lo tanto el largo de las ramas disminuye en esa proporción.

:escala es el coeficiente de variación entre las ramas de cada nivel. Si fuese 1 las ramas serían todas iguales al tronco. La naturaleza indica que debe ser menor que 1 para que las ramas disminuyan su tamaño,:

angu es el ángulo entre las ramas que es constante.

El procedimiento tiene 2 líneas recursivas (marcadas en rojo). Si el procedimiento fuese reducido hasta la primer recursión, quedaría:

PARA ARBOL :niv :largo :escala :angu
si :niv = 0 [alto]

poncl :niv

av :largo

gd :angu

ARBOL :niv – 1 :largo*:escala :escala :angu

fin

arbolMITADNIV4_200_08_45 ARBOLMITAD4_200_06_45 arbolMITADNIV4_200_08_25
Nivel = 4 (4 ramas)Largo de la primer rama= 200Coeficiente variación = 0,8Ángulo entre ramas del mismo nivel = 45º Nivel = 4 (4 ramas)Largo de la primer rama= 300Coeficiente variación = 0,6Ángulo entre ramas del mismo nivel = 45º Nivel = 4 (4 ramas)Largo de la primer rama= 200Coeficiente variación = 0,6Ángulo entre ramas del mismo nivel = 25º

El segmento azul corresponden al nivel 1, el verde al 2, el celeste al 3 y el rojo al 4.

Para largo inicial = 200, coeficiente = 0,8 y ángulo = 45, podemos ver abajo la variación del árbol fractal para 14 <= Nivel => 1

El pase de diapositivas requiere JavaScript.

FANTASMAS QUE GENERAN FANTASMAS

La primer recursión genera “acciones pendientes” que a su vez generan acciones pendientes. Llamaremos:

PARTE A a las líneas AV :largo gd :angu

PARTE B a GI :angu *2 (queda entre las 2 recursiones)

PARTE C a RE :largo GD :angu

La PARTE A es la acción activa que grafica las ramas, La PARTE B corrige el giro. La PARTE C retrocede las ramas.

La cantidad de ramas es una función del nivel de la recursión

NIV 1 1 RAMA R1 = 2 NIV – 1

NIV 2 3 RAMAS R2 = R1 + 2 NIV – 1

NIV 3 7 RAMAS R3 = R 2 + 2 NIV – 1

NIV 4 15 RAMAS R4 = R3 + 2 NIV – 1

NIV 5 21 RAMAS R5 = R4 + 2 NIV – 1

En general Rn = R n-1 + 2 ^n-1

La secuencia de acciones y “acciones pendientes” en cada nivel sería:

Nivel

Acción

Pendientes B

Pendientes C

2

Av 200 Gd 30 Gi 60 (2)Árbol 1 100 Gd 30 re 200 (2)

1

Av 100 Gd 30 Gi 60 (11)Arbol 0 50 Gd 30 re 100 (1)

1

Gi 60 (11)

1

Gd 30 Re 100 (1)

2

Gi 60 (2)

1

(Arbol 1 100)Av 100 Gd 30 Gi 60 (12)Arbol 0 Gd 30 re 100 (1)

1

Gi 60 (12)

1

Gd 30 Re 100 (1)

2

Gd 30 Re 200 (2)

Para un árbol de nivel = N habrá N avances, N GI :angu *2 y N retrocesos.

VARIACIONES COLORIDAS

PARA ARBOL1 :niv :largo :escala :angu
si :niv = 0 [alto]
pongrosor entero :niv / 2
poncl :niv
av :largo
gd :angu
ARBOL1 :niv – 1 :largo*:escala :escala :angu
gi 2 * :angu
ARBOL1 :niv – 1 :largo*:escala :escala :angu
poncl :niv
gd :angu
re :largo
fin

A este procedimiento se le ha agregado el grosor y el color en función del Nivel.

(Clickea sobre una de las imágenes para verlas en su real dimensión)

EL BOSQUE NO DEJA VER EL ÁRBOL

PARA ARBOL2 :niv :largo :escala :angu
si :niv = 0 [alto]
pongrosor entero :niv / 2
poncl (frase :niv*5 :niv*10 :niv*10)
av :largo
gd :angu
ARBOL2 :niv – 1 :largo*:escala :escala :angu
gi 2 * :angu
ARBOL2 :niv – 1 :largo*:escala :escala :angu
poncl (frase :niv*2 :niv*3 :niv*4)
gd :angu
re :largo * 1
fin

BOSQUE ARBOL2

BOSQUE ARBOL2

INTERVENCIONES ARBÓREAS

Agreguemos una línea recursiva más y debajo de ella la graficación de un triángulo: BL gi 30 repite 3 [av :niv*3 gd 120] gd 30

PARA ARBOL4 :niv :largo :escala :angu
si :niv = 0 [alto]
pongrosor entero :niv / 2
poncl 10
av :largo
gd :angu
ARBOL4 :niv – 1 :largo*:escala :escala :angu
gi 2 * :angu
ARBOL4 :niv – 1 :largo*:escala :escala :angu
poncl 0
SL gd :angu
re :largo
BL
ARBOL4 :niv – 1 :largo*:escala :escala :angu
poncl 5
BL gi 30 repite 3 [av :niv*3 gd 120] gd 30
fin

(Clickea sobre una de las imágenes para verlas en su real dimensión)

En ARBOL4BIS agregamos un arco de circunferencia con la línea: REPITE 30 [GI 5 RE :niv] gd 30

PARA ARBOL4BIS :niv :largo :escala :angu
si :niv = 0 [alto]
pongrosor entero :niv / 2
poncl (FRASE AZAR 55 AZAR 235 AZAR 75)
av :largo
gd :angu
ARBOL4BIS :niv – 1 :largo*:escala :escala :angu
gi 2 * :angu
ARBOL4BIS :niv – 1 :largo*:escala :escala :angu
poncl 2
gd :angu
re :largo
ARBOL4BIS :niv – 1 :largo*:escala :escala :angu
poncl (FRASE AZAR 155 AZAR 235 AZAR 75)
gi 30 repite 30 [av :niv gd 5]

REPITE 30 [GI 5 RE :niv] gd 30
fin

(Clickea sobre una de las imágenes para verlas en su real dimensión)

ARBOLES ASIMÉTRICOS

En ARBOLX la variación reside en la línea gi :angu en lugar de gi :angu * 2

PARA ARBOLX :niv :largo :escala :angu
si :niv = 0 [alto]
pongrosor entero :niv / 2
poncl :niv + 10
av :largo
gd :angu
ARBOLX :niv – 1 :largo*:escala :escala :angu
gi :angu
ARBOLX :niv – 1 :largo*:escala :escala :angu
sl
re :largo
bl
fin

Ejecutando arbolx 16 200 0.7 30 (16 niveles de fractal, 200 = L inicial, 0,7 coeficiente de variación de L y 30º de ángulo.

arbolx 16 200 0.7 30

arbolx 16 200 0.7 30

Ejecutando arbolx 16 200 0.7 30 y luego arbolx 16 200 0.7 -30, obtenemos:

(Clickea sobre una de las imágenes para verlas en su real dimensión)

En ARBOLX2 el cambio está en la linea gi :angu * 1.5 en lugar de gi :angu * 2. El efecto es que las ramas de desplazan hacia la derecha. Si el cambio fuese gi :angu * 2.5 el desplazamiento sería hacia la izquierda.

PARA ARBOLX2 :niv :largo :escala :angu
si :niv = 0 [alto]
pongrosor entero :niv / 2
poncl :niv + 11
av :largo
gd :angu
ARBOLX2 :niv – 1 :largo*:escala :escala :angu
gi :angu * 1.5
ARBOLX2 :niv – 1 :largo*:escala :escala :angu
sl
GD :ANGU * 0.5
re :largo
bl
fin

(Clickea sobre una de las imágenes para verlas en su real dimensión)

Finalmente en arbolx3 reemplazamos los avances por arcos definidos por REPITE ENTERO :LARGO [AV 1 GD :AN], donde :AN es un input que define la curvatura del arco.

PARA ARBOLX3 :niv :largo :escala :angu :AN
si :niv = 0 [alto]
pongrosor entero :niv / 2
poncl :niv + 11
REPITE ENTERO :largo [AV 1 GD :AN]
gd :angu
ARBOLX3 :niv – 1 :largo*:escala :escala :angu :AN
gi :angu * 2
ARBOLX3 :niv – 1 :largo*:escala :escala :angu :AN
poncl :niv + 11
GD :ANGU
REPITE ENTERO :largo [GI :AN RE 1]
fin

(Clickea sobre una de las imágenes para verlas en su real dimensión)

EN BUSCA DE LA INMORTALIDAD

Decidido a encontrar un FRACTAL que lleve mi nombre y pasar a salón de la inmortalidad tal como el sueco Helge von Koch, o los polacos Benoit Mandlebrot, y Waclaw Sierpinski, encontré un procedimiento que resultó en un “fractal” difícil e clasificar, quizás un seudofractal.

para acuad1 :niv :lado :co
si :niv = 0 [alto]
poncl 1 + azar 14
av :lado / 2
gi 90
acuad1 :niv – 1 :lado * :co :co
gd 180
acuad1 :niv – 1 :lado * :co :co
gi 90
av :lado /2
fin

Los giros son gi 90 y el giro intermedio gi 180. La sucesión de figuras entre n = 1 y n = 8 sería :

El pase de diapositivas requiere JavaScript.

Una curiosidad de este procedimiento es que en el nivel 2 a partir de la L original se genera 1 rama, pero luego de cada rama surgen 2 ramas. La Longitud fractal es una progresión aritmética a partir del nivel 2. Quizás este sea un NonFractal de Eduardo Cavallo, pero visualmente interesante.

L0 = 0

L1 = L

L2 = L + L. :co

L3 = L + L . co + L . co . co * 2

L4 = L + L . co + L . co . co * 2 + L . co . co . co * 2 * 2

Ln = L + L . co + L . co . co * 2 + L . co . co . co * 2 * 2 + … + L . co ^ (n-1) . 2 ^(n-2)

 

(Clickea sobre una de las imágenes para verlas en su real dimensión)

El procedimiento acuad ha sido “adornado” con un círculo después del avance av :lado / 2 REPITE 90 [AV 1 GD 4]

para acuad :niv :lado :co
si :niv = 0 [alto]
pongrosor entero :niv / 2
poncl 1 + azar 11
av :lado / 2 REPITE 90 [AV 1 GD 4]
gi 90
acuad :niv – 1 :lado * :co :co
gd 180
acuad :niv – 1 :lado * :co :co
gi 90
av :lado /2 REPITE 90 [AV 1 GD 4]
fin

 

(Clickea sobre una de las imágenes para verlas en su real dimensión)

ARBOL 3D

En el libro Ideas y Formas del Ing. Horacio C. Reggini, ya citado en otro artículo sobre Logo tridimensional, se publicó el procedimiento para un arbol fractal en 3d. Traducido a los comandos FMSLOGO

para arbol3d :l :b :niv :co
si :niv = 0 [alto]
pongrosor :niv
poncl (6 – :niv) * 2
av :l
repite :b [gi 45 arbol3d :l * :co :b :niv-1 :co gd 45 rightroll 360 / :b]
poncl (6 – :niv) * 2
re :l
fin

La línea recursiva tiene la novedad de que está dentro de un repite. Las variables son:

:l el largo de la primera rama

:b la cantidad de ramas (entre rama y rama hay un rightroll (rolar a la derecha)

:niv la cantidad de niveles fractales

:co el coeficiente en que las ramas disminuyen entre nivel y nivel.

 

(Clickea sobre una de las imágenes para verlas en su real dimensión)

COMPOSICIONES 3D

Reflejo en el agua Intervención en Photoshop

Reflejo en el agua
Intervención en Photoshop

Partido por un rayo

Partido por un rayo

EL ARBOL DE PURMAMARCA

purmamarca_300_6_6_06

METAMORFÓSIS. Fusionando Logo con Morphings,

Imagen del árbol tomada en Purmamarca.

LA DANZA DEL ÁRBOL 3D

Esta animación fue compaginada en Movie Maker a partir de 90 frames generados en FMS LOGO con los siguientes procedimientos, previa creación de la variable local “animacion3d

Haz “animacion3d 1

animacion3d1 1

para animacion3d1 :num
si :num > 36 [animacion3d2 :num alto]
limpia
arbol3d 300 5 5 0.55
rightroll 10
downpitch 3
guardadib (palabra “animacion3d :num “.bmp)
animacion3d1 :num + 1
fin

para animacion3d2 :num
si :num > 68 [animacion3d3 :num alto]
limpia
arbol3d 300 5 5 0.55
sisino :num < 52 [uppitch -8][uppitch 8]
guardadib (palabra “animacion3d :num “.bmp)
animacion3d2 :num + 1
fin

para animacion3d3 :num
si :num > 80 [animacion3d4 :num alto]
limpia
arbol3d 300 5 5 0.55
leftroll 10
guardadib (palabra “animacion3d :num “.bmp)
animacion3d3 :num + 1
fin

para animacion3d4 :num
si :num > 90 [alto]
limpia
arbol3d 300 5 5 0.55
uppitch 5 leftroll 1 gi 5
guardadib (palabra “animacion3d :num “.bmp)
animacion3d4 :num + 1
fin

LOS FRACTALES DE SIERPINSKI

leemos en la Wiki, que Waklau Franciszek Sierpinski fue un notable matemático polaco (1882 – 1969). Son notables sus aportaciones a la teoría de conjuntos, la teoría de números, la topología y la teoría de funciones. En la teoría de conjuntos realizó importantes contribuciones para el axioma de elección y la hipótesis del continuo. Estudió la teoría de la curva que describe un camino cerrado que contiene todos los puntos interiores de un cuadrado. Publicó más de 700 trabajos y 50 libros.

Tres conocidos fractales llevan su nombre: el triángulo de Sierpinski, la alfombra de Sierpinski y la curva de Sierpinski. También los números de Sierpinski en teoría de números han sido nombrados así en su honor.

EL TRIÁNGULO DE SIERPINSKI

Parte de un triángulo equilátero que se divide en 4 triángulos igualmente equiláteros y de igual superficie entre sí. En el siguiente nivel cada triángulo del nivel – 1 se subdivide en 4 triángulos y así hasta el infinito (y más allá …). Si Sn es la superficie del triángulo más pequeños de cada nivel, tenemos que: Sn = S (n-1) / 4 , en el límite la S∞ = 0. Veamos la serie entre 1 y 12

El procedimiento LOGO sería:

para triserpi :niv :lado
si :niv = 0 [alto]
poncl 7
av :lado
gd 120
triserpi :niv – 1 :lado / 2
poncl 7
av :lado
gd 120
triserpi :niv – 1 :lado / 2
poncl 7
av :lado
gd 120
triserpi :niv – 1 :lado / 2
fin

LA PIRÁMIDE DE SIERPINSKI

Recurrimos a los comandos tridimensionales para graficar la pirámide de Serpinski.

para zerpinskypiramide

perspectiva

pongrosor 1

sl gi 90 av 300 gd 90 re 250 bl

repite 4 [downpitch 35 gd 30 triserpi 6 1200 gd 60 av 600 gi 90 uppitch 35 rightroll 90 ]
fin

Pirámide Caras nivel = 6

Pirámide
Caras nivel = 6

Caras Nivl 5

ANIMACIÓN DE LA PIRÁMIDE DE SIERPINSKI

Esta animación está constituida por 90 “cuadros” generados en FMS LOGO y compaginados y musicalizados en Movie Maker. La animación consta de 6 partes correspondienes a los siguientes procedimientos. Recordar que para trabajar con los comandos tridimensionales hay que colocar previamente la orden PERSPECTIVA.

para animacionserpi1 :num
si :num > 12 [ animacionserpi2 :num alto]
rightroll 10
limpia
sl downpitch 90 re 40 uppitch 90 bl
repite 4 [downpitch 35 gd 30 aatri 5 720 gd 60 av 360 gi 90 uppitch 35 rightroll 90 ]
guardadib (palabra “pirazerpi :num “.bmp)
animacionserpi1 :num + 1
fin

para animacionserpi2 :num
si :num > 21 [sl gd 90 av 180 gi 90 downpitch 90 av 180 uppitch 90 animacionserpi3 :num alto]
limpia
sl re 10 gi 5 bl
repite 4 [downpitch 35 gd 30 aatri 5 720 gd 60 av 360 gi 90 uppitch 35 rightroll 90 ]
guardadib (palabra “pirazerpi :num “.bmp)
animacionserpi2 :num + 1
fin

para animacionserpi3 :num
si :num > 33 [animacionserpi4 :num alto]
limpia
rightroll 12
sl downpitch 90 re 180 uppitch 90 gd 90 re 180 gi 90 bl
repite 4 [downpitch 35 gd 30 aatri 5 720 gd 60 av 360 gi 90 uppitch 35 rightroll 90]
sl gd 90 av 180 gi 90 downpitch 90 av 180 uppitch 90
guardadib (palabra “pirazerpi :num “.bmp)
animacionserpi3 :num + 1
fin

para animacionserpi4 :num
si :num > 42 [sl downpitch 90 re 180 uppitch 90 gd 90 re 180 gi 90 bl animacionserpi5 35 :num alto]
limpia
poncl 3
uppitch 4 gi 6
sl downpitch 90 re 180 uppitch 90 gd 90 re 180 gi 90 bl
repite 4 [downpitch 35 gd 30 aatri 5 720 gd 60 av 360 gi 90 uppitch 35 rightroll 90]
sl gd 90 av 180 gi 90 downpitch 90 av 180 uppitch 90
guardadib (palabra “pirazerpi :num “.bmp)
animacionserpi4 :num + 2
fin

para animacionserpi5 :ang :num
si :ang < -30 [animacionserpi6 :ang :num alto]
limpia
bl
repite 4 [downpitch :ang gd 30 aatri 5 720 gd 60 av 360 gi 90 uppitch :ang rightroll 90]
guardadib (palabra “pirazerpi :num “.bmp)
animacionserpi5 :ang – 1 :num + 1
fin

para animacionserpi6 :ang :num
si :ang > 90 [alto]
limpia
bl
repite 4 [downpitch :ang gd 30 aatri 5 720 gd 60 av 360 gi 90 uppitch :ang rightroll 90]
guardadib (palabra “pirazerpi :num “.bmp)
animacionserpi6 :ang + 1 :num + 1
fin

DELIRIOS FRACTALES

Los delirios fractales son experimentos con procedimientos recursivos que fui creando y transformando de acuerdo a lo que resultaban, en busca de un placer estético. Uno de ellos lo “intervine” manualmente rellenando con color.

para acuadra :niv :lado :co
si :niv = 0 [alto]
pongrosor entero :niv / 10
poncl 1
av :lado / 3
gi 90
acuadra :niv-1 :lado*:co :co
gd 180
acuadra :niv-1 :lado*:co :co
poncl 8
AV :lado / 3
gI 90
fin

para acuadra1
bp sl ponxy -200 -180 bl

acuadra 18 60 0.8
fin

DELIRIO FRACTAL CUADRA1

DELIRIO FRACTAL
CUADRA1 N = 18

para acuadra2
bp sl ponxy -200 -110 bl acuadra 24 40 0.8
fin

DELIRIO FRACTAL CUADRA2

DELIRIO FRACTAL
CUADRA2 N = 24

PARA DELIRIO2 :niv :LARGO :ESCALA :ANGU
SI :niv = 0 [ALTO]
PONGROSOR ENTERO :niv / 4
PONCL (FRASE AZAR 255 150 101)
REPITE ENTERO :largo [AV 1 / 2 GD 1]
REPITE ENTERO :largo [AV 1 / 2 GI 1]
DELIRIO2 :niv – 1 :LARGO*:ESCALA :ESCALA :Angu
GI :angu * 2
DELIRIO2 :niv – 1 :LARGO*:ESCALA :ESCALA :ANGU
PONCL (FRASE AZAR 150 101 AZAR 255)
PONGROSOR ENTERO :niv / 4
REPITE ENTERO :LARGO [Gd 1 RE 1]
FIN

DELIRIO FRACTAL DELIRIO2 22 190 0.7 100

DELIRIO FRACTAL
DELIRIO2 22 190 0.7 100

DELIRIO FRACTAL DELIRIO2 22 190 0.75 10

DELIRIO FRACTAL
DELIRIO2 22 190 0.75 10

PARA DELIRIO3 :niv :LARGO :ESCALA :ANGU
SI :niv = 0 [ALTO]
PONGROSOR ENTERO :niv / 4
PONCL (FRASE AZAR 0 AZAR 150 AZAR 101)
REPITE :niv [AV :LARGO GD 180/:niv]
DELIRIO3 :niv – 1 :LARGO*:ESCALA :ESCALA :Angu
GI 160
DELIRIO3 :niv – 1 :LARGO*:ESCALA :ESCALA :ANGU
PONCL (FRASE AZAR 150 AZAR 101 0)
PONGROSOR ENTERO :niv / 4
REPITE :niv [AV :LARGO/2 GD 180/:niv]
FIN

Este fractal fue intervenido manualmente y pintado con el comando RELLENA

DELIRIO FRACTAL DELIRIO 3 22 190 0.6 0

DELIRIO FRACTAL
DELIRIO3 22 190 0.6 0

DELIRIO FRACTAL  DELIRIO 3 22 190 0.6 10

DELIRIO FRACTAL
DELIRIO 3 22 190 0.6 10

LA ALFOMBRA DE SIERPINSKI

Dejo como desafío la resolución en Logo de este fractal que parte de 1 cuadrado de dimensión L, que en el siguiente nivel se subdivide en 9 cuadrados de igual dimensión y así sucesivamente.

Alfombra de serpinski

Alfombra de Sierpinski

En la página http://www2.caminos.upm.es/departamentos/matematicas/Fdistancia/PIE/Logo%20Francisco/Fractales%20con%20Logo.htm podrán encontrar un buen número de fractales resueltos en Logo.

RECURSIÓN AVANZADA PARA CREACIÓN DE FUNCIONES

En este tiempo que me ha tomado reunir el material, recrear los procedimientos, crear variaciones, compaginar los cuadros en vídeo, he sentido la dificultad de comprender los procesos fractales y encontrar aplicaciones. Aunque éstas están definidas, la falta de un conocimiento matemático profundo ha sido un obstáculo para hallar la “clave” de la programación de cualquier fractal. Es un magnífico ejemplo de cómo el conocimiento específico de lo que se desea programar, debe anteceder al conocimiento operatorio, en este caso de la programación.

Me adentraré entonces en otra aplicación de la recursión avanzada, que sí me es familiar y transparente. La creación de funciones alfanuméricas complejas que barren recursivamente un input y operan sobre él. Esta aplicación hace uso del comando DEVUELVE, en FMS LOGO DEV, en Micromundos RE (Reporta), Este comando permite que un procedimiento “devuelva” una valor que puede ser argumento de otro procedimiento. Logo posee comandos reporteros que pueden utilizarse como argumento de otros procedimientos, por ejemplo:

POS (devuelve la posición de la tortuga activa)

COORX (devuelve la coordenada X de la tortuga aiva)

FECHA (devuelve una lista con la fecha y la hora actual)

Como hemos dicho pueden utilizarse como argumentos de otros procedimienos. Por ejemplo

ES FECHA

Thu Aug 08 00:36:26 2013

ES POS

300 0

SI COORX > 200 [ALTO]

CREANDO REPORTEROS SIMPLES

Como el comando FECHA reporta la Fecha y hora actual, creemos 2 reporteros diferentes;ç

Para fecha?

dev (frase item 1 hora item 2 hora item 3 hora item 5 hora)
fin

para hora?
dev (item 4 hora)
fin

es hora
Thu Aug 08 09:30:51 2013

es fecha?
Thu Aug 08 2013

es hora?
09:30:59

DEVOLUCIÓN DE FANTASMAS EN RECURSIÓN AVANZADA

Combinemos la propiedad de la recursión de dejar tareas pendientes en memoria y el comando DEV para crear un procedimiento que devuelva el resultado de una operación iterativa. por ejemplo que devuelva la suma de una lista de valores numéricos. Llamemos a la función SUMA como en el Excel.

para suma :listado
si vacio? :listado [dev 0]
dev (primero :listado) + suma menosprimero :listado
fin

La recursión devuelve el valor del primer elemento de la lista numérica + el resultado del procedimiento con la lista dismimuida en su 1º elemento y así sucesivamente hasta que la lista quede vacía. Los valores de la suma quedarán en memoria hasta que vacio? :listado sea cierto. La consecuencia tiene que ser una devolución (no hay que poner alto) porque la estructura de la recursión demanda que cada ciclo devuelva algo. En general esta última devolución que además detiene el ciclo debe ser el elemento neutro respecto a la operación. En este caso es el 0 porque la operación es la suma. Analicemos como funciona el procedimiento en cada iteración.

SUMA [1 2 3]

Acción

Pendientes

Suma [1 2 3] 1 +
Suma [2 3] 2 +
Suma [3] 3 +
Suma [] 0

Al detenerse se ejecutan las “acciones pendientes”, 1 + 2 + 3 + 0 = 6

ES SUMA [1 2 3]

6

para factorial :n

si :n = 0 [dev 1]
dev :n * factorial :n – 1
fin

Si n=0 devuelve 1 que es el elemento neutro del producto. Además por definición el factorial de 0 es 1.

Acción

Pendiente

Factorial 4 4 *
Factorial 3 3 *
Factorial 2 2 *
Factorial 1 1 *
Factorial 0 1

Al detenerse se ejecutan las “acciones pendientes”, 4 * 3 * 2 * 1 * 1

ES FACTORIAL 4

24

IZQ Y DER

Creemos en Logo las funciones IZQ (texto) (nº caracteres) y DER (texto) (nº caracteres) como las que existen en EXCEL.

PARA IZQ :WORD :NUM
SI :NUM > CUENTA :WORD [DEV “ERROR] (Donde ” es el elemento neutro de la operación PALABRA)
SI :NUM = 0 [DEV “]
DEV PALABRA PRIMERO :WORD IZQ MP :WORD :NUM – 1
FIN

Acción

Pendiente

IZQ “LOGUEAR 3 Palabra L
IZQ “OGUEAR 2 Palabra O
IZQ “GUEAR 1 Palabra G
IZQ “UEAR 0

Al detenerse se ejecutan las operaciones PALABRA “L PALABRA “O PALABRA “G

IZQ “LOGUEAR 3

LOG

PARA DER :WORD :NUM
SI :NUM > CUENTA :WORD [DEV “ERROR]
SI :NUM = 0 [DEV “]
DEV PALABRA DER MU :WORD :NUM – 1 ULTIMO :WORD
FIN

Acción

Pendiente

DER “PROLOGO 4 PALABRA (DER siguiente) “O
DER “PROLOG 3 PALABRA (DER siguiente) “G
DER “PROLO 2 PALABRA (DER siguiente) “O
DER “PROL 1 PALABRA (DER siguiente) “L
DER “PRO 0

Al finalizar se ejecutan las acciones pendientes PALABRA “L PALABRA “O PALABRA “G PALABRA “O “

DER “PROLOGO 4

LOGO

Aparentemente ejecuta las pendientes en sentido inverso, pero sucede que la recursión pendiente en N = 4 (DER 3) la deriva hasta DER 1 de donde comienza a ejecutar la operación,

BASE NUMÉRICA

El siguiente procedimiento recursivo devuelve un número en base 10 en la base indicada en el 1º INPUT

PARA BASE :B :NUM
SI :NUM < :B [DEV :NUM]
DEV PALABRA BASE :B ENTERO :NUM / :B RESTO :NUM :B
FIN

ES BASE 2 10
1010
ES BASE 4 10
22

ES BASE 8 10
12

ES BASE 10 10
10

JERINGOZO

El siguiente procedimiento recibe una palabra y devuelve la misma en “jeringozo”

PARA JERINGOZO :WORD
SI VACIO? :WORD [DEV “]
SISINO MIEMBRO? PRIMERO :WORD [A E I O U] [DEV PALABRA (PALABRA PRIMERO :WORD “P PRIMERO :word) JERINGOZO MP :WORD] [DEV PALABRA PRIMERO :WORD JERINGOZO MP :WORD]
FIN

es jeringozo “logo
loPogoPo

es jeringozo “argentina
aPargePentiPinaPa

es jeringozo “amor
aPamoPor

es jeringozo “eduardo
ePeduPuaPardoPo

SACARVOCALES

PARA SACARVOCALES :WORD
SI VACIO? :WORD [DEV “]
SISINO MIEMBRO? PRIMERO :WORD [A E I O U] [DEV SACARVOCALES MP :WORD ] [DEV PALABRA PRIMERO :WORD SACARVOCALES MP :WORD]
FIN

ES SACARVOCALES “MARIPOSA
MRPS

ES SACARVOCALES “MONITOR
MNTR

ES SACARVOCALES “CATALINA
CTLN

EPÍLOGO

En este viaje, siempre incompleto, por el mundo de la recursión, nos permite palpar la cualidad del Logo (no en exclusiva) de conectar lo elemental con lo complejo, “sin piso, sin techo” como decía Papert. Recientemente comentaba a mis alumnos que el material Meccano es como el Logo, un material para armar dirigido a niños que pueden lograr, a partir de piezas elementales, construcciones a medida de sus posibilidades: Desde una hamaca, un pequeño auto, un subibaja o un tobogán. Pero al mismo tiempo es el material que utilizan profesionales para construir complejos diseños: relojes, grúas, motores y brazos. Es en definitiva el conocimiento conceptual y fáctico, así como el nivel evolutivo de nuestros esquemas lógicos con los cuáles entendemos y manipulamos el mundo que nos rodea, los que dan alas a nuestras ideas y los que, en cierta forma, también determinan nuestros intereses y nuestra voluntad .

En lo personal he desafiado un límite. Puedo construir y experimentar con recursión avanzada, jugar con los fantasmas sembrados en la RAM, pero no he logrado representar mentalmente el complejo mapa de relaciones entre ciclos que quedan pendientes dentro de ciclos que quedan pendientes dentro de ciclos que quedan …

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s