|
|
|
|
8
|
|
8
|
|
9
|
Una técnica muy utilizada en programación es la *recursión*. Con esta técnica se resuelven problemas resolviendo un problema similar, pero para casos más pequeños. Podemos construir conjuntos de objetos o procesos utilizando *reglas recursivas* y *valores iniciales*. Las *funciones recursivas* son funciones que se auto-invocan, utilizando cada vez conjuntos o elementos más pequeños, hasta llegar a un punto en donde se utiliza el valor inicial en lugar de auto-invocarse. Los fractales son un ejemplo de figuras que se pueden crear usando recursión. En esta experiencia de laboratorio practicarás la definición e implementación de funciones recursivas para dibujar formas auto-similares (fractales).
|
9
|
Una técnica muy utilizada en programación es la *recursión*. Con esta técnica se resuelven problemas resolviendo un problema similar, pero para casos más pequeños. Podemos construir conjuntos de objetos o procesos utilizando *reglas recursivas* y *valores iniciales*. Las *funciones recursivas* son funciones que se auto-invocan, utilizando cada vez conjuntos o elementos más pequeños, hasta llegar a un punto en donde se utiliza el valor inicial en lugar de auto-invocarse. Los fractales son un ejemplo de figuras que se pueden crear usando recursión. En esta experiencia de laboratorio practicarás la definición e implementación de funciones recursivas para dibujar formas auto-similares (fractales).
|
10
|
|
10
|
|
|
|
11
|
+
|
11
|
Los ejercicios de esta experiencia de laboratorio son una adaptación de https://sites.google.com/a/wellesley.edu/wellesley-cs118-spring13/lectures-labs/lab-6-turtle-recursion.
|
12
|
Los ejercicios de esta experiencia de laboratorio son una adaptación de https://sites.google.com/a/wellesley.edu/wellesley-cs118-spring13/lectures-labs/lab-6-turtle-recursion.
|
12
|
|
13
|
|
13
|
|
14
|
|
|
|
|
|
43
|
---
|
44
|
---
|
44
|
|
45
|
|
45
|
|
46
|
|
46
|
-Una manera ingeniosa de practicar y "visualizar" recursión es programando funciones que produzcan figuras auto-similares (o recursivas). Por ejemplo, considera una figura recursiva que llamaremos *rama*. La Figura 3 muestra `rama(0,90)`, `rama(1,90)` y `rama(2,90)`.
|
|
|
|
|
47
|
+Una manera ingeniosa de practicar y visualizar recursión es programando funciones que produzcan figuras auto-similares (o recursivas). Por ejemplo, considera una figura recursiva que llamaremos *rama*. La Figura 3 muestra `rama(0,90)`, `rama(1,90)` y `rama(2,90)`.
|
47
|
|
48
|
|
48
|
---
|
49
|
---
|
49
|
|
50
|
|
|
|
|
|
54
|
---
|
55
|
---
|
55
|
|
56
|
|
56
|
¿Puedes ver el comportamiento recursivo de esta figura? Nota que `rama(0,90)` es solo un segmento vertical (un segmento en un ángulo de 90 grados); `rama(1,90)` es `rama(0,90)` con dos segmentos inclinados en su extremo superior. Más preciso, `rama(1,90)` es `rama(0,90)` con una `rama(0,60)` y una `rama(0,120)` en el extremo superior. Similarmente, `rama(2,90)` es `rama(0,90)` con dos `rama(1,90)` inclinadas en el extremo superior. Esto es, `rama(2,90)` es:
|
57
|
¿Puedes ver el comportamiento recursivo de esta figura? Nota que `rama(0,90)` es solo un segmento vertical (un segmento en un ángulo de 90 grados); `rama(1,90)` es `rama(0,90)` con dos segmentos inclinados en su extremo superior. Más preciso, `rama(1,90)` es `rama(0,90)` con una `rama(0,60)` y una `rama(0,120)` en el extremo superior. Similarmente, `rama(2,90)` es `rama(0,90)` con dos `rama(1,90)` inclinadas en el extremo superior. Esto es, `rama(2,90)` es:
|
|
|
58
|
+
|
57
|
`rama(0,90)` con una `rama(1,60)` y una `rama(1,120)` en el extremo superior. Nota que $$60=90-30$$ y que $$120=90+30$$.
|
59
|
`rama(0,90)` con una `rama(1,60)` y una `rama(1,120)` en el extremo superior. Nota que $$60=90-30$$ y que $$120=90+30$$.
|
58
|
|
60
|
|
59
|
-De esta manera podemos expresar `rama(n,A)` como una composición de $$n$$ ramas más pequeñas e inclinadas. El Código 1 provee una manera de expresar `rama` como una función recursiva.
|
|
|
|
|
61
|
+De esta manera podemos expresar `rama(n,A)` como una composición de ramas de $$n$$ ramas más pequeñas e inclinadas. El Código 1 provee una manera de expresar `rama` como una función recursiva.
|
60
|
|
62
|
|
61
|
---
|
63
|
---
|
62
|
|
64
|
|
|
|
|
|
91
|
|
93
|
|
92
|
En la experiencia de laboratorio de hoy implementarás funciones recursivas para producir fractales.
|
94
|
En la experiencia de laboratorio de hoy implementarás funciones recursivas para producir fractales.
|
93
|
|
95
|
|
|
|
96
|
+
|
94
|
### Ejercicio 1 - Copo de nieve
|
97
|
### Ejercicio 1 - Copo de nieve
|
95
|
|
98
|
|
96
|
Una de las figuras fractales más simples es la figura de un copo de nieve. Esta figura se forma a partir de un triángulo isósceles, sustituyendo el segmento del tercio del medio de cada lado por una "V" invertida. La medida de los lados de la "V" es igual a la medida del segmento que sustituye. Usaremos el copo de nieve para ilustrar el proceso de recursión.
|
99
|
Una de las figuras fractales más simples es la figura de un copo de nieve. Esta figura se forma a partir de un triángulo isósceles, sustituyendo el segmento del tercio del medio de cada lado por una "V" invertida. La medida de los lados de la "V" es igual a la medida del segmento que sustituye. Usaremos el copo de nieve para ilustrar el proceso de recursión.
|
|
|
|
|
103
|
|
106
|
|
104
|
---
|
107
|
---
|
105
|
|
108
|
|
106
|
-#### Instrucciones:
|
|
|
|
|
109
|
+#### Instrucciones
|
107
|
|
110
|
|
108
|
1. Carga a `QtCreator` el proyecto `RecursiveShapes`. Hay dos maneras de hacer esto:
|
111
|
1. Carga a `QtCreator` el proyecto `RecursiveShapes`. Hay dos maneras de hacer esto:
|
109
|
|
112
|
|
|
|
|
|
112
|
|
115
|
|
113
|
2. Compila y corre el programa para que veas una figura del copo de nieve construida con 3 iteraciones de la función `snowflake`. Puedes ver el código que define esta función en el archivo `snowflake.cpp` del proyecto de `Qt`.
|
116
|
2. Compila y corre el programa para que veas una figura del copo de nieve construida con 3 iteraciones de la función `snowflake`. Puedes ver el código que define esta función en el archivo `snowflake.cpp` del proyecto de `Qt`.
|
114
|
|
117
|
|
115
|
- En la función `main`, busca la línea en donde se declara y da valor a la variable `level`. Cambia el valor de `level` a `0` y corre el programa de nuevo. Podrás ver el triángulo que representa el caso base de la recursión para el copo de nieve. Continúa cambiando el valor de la variable `level` y corriendo el programa para que veas el proceso de la recursión y de producir figuras auto-similares.
|
|
|
|
|
118
|
+En la función `main`, busca la línea en donde se declara y da valor a la variable `level`. Cambia el valor de `level` a `0` y corre el programa de nuevo. Podrás ver el triángulo que representa el caso base de la recursión para el copo de nieve. Continúa cambiando el valor de la variable `level` y corriendo el programa para que veas el proceso de la recursión y de producir figuras auto-similares.
|
116
|
|
119
|
|
117
|
|
120
|
|
118
|
### Ejercicio 2 - Cajas autosimilares
|
121
|
### Ejercicio 2 - Cajas autosimilares
|
|
|
|
|
169
|
[4] http://www.coolmath.com/fractals/images/fractal5.gif
|
172
|
[4] http://www.coolmath.com/fractals/images/fractal5.gif
|
170
|
|
173
|
|
171
|
[5] "Fractal tree (Plate b - 2)". Licensed under Public domain via Wikimedia Commons - http://commons.wikimedia.org/wiki/File:Fractal_tree_(Plate_b_-_2).jpg#mediaviewer/File:Fractal_tree_(Plate_b_-_2).jpg
|
174
|
[5] "Fractal tree (Plate b - 2)". Licensed under Public domain via Wikimedia Commons - http://commons.wikimedia.org/wiki/File:Fractal_tree_(Plate_b_-_2).jpg#mediaviewer/File:Fractal_tree_(Plate_b_-_2).jpg
|
172
|
-
|
|
|
173
|
----
|
|
|
174
|
-
|
|
|
175
|
----
|
|
|
176
|
-
|
|
|
177
|
----
|
|
|
178
|
-
|
|
|
179
|
-
|
|
|