El árbol recursivo

En esta práctica de laboratorio, construirás un programa para dibujar árboles que utiliza la recursión para dibujar las ramas creando árboles cada vez más pequeños.

En esta página, explorarás la anidación del código para árboles dentro del código para árboles.

Brian's Notes from late July 2016:

PG: Change. I still have great reservations about the pedagogy. We are telling kids, step by step, how to do something before they have a picture of what they're trying to control. At least two other alternatives: create árbol governed by tamaño (as we do in Unit 1 or 2) and embed, /then/ show how one might want to control growth by count rather than tamaño; create árbol by abstract model (trunk, branch, and leaf, which is also the base case) showing structural similarities and differences. Neither of these succeeds in getting to the generic "formula"—stop rule dependent on decrementing input, body, recursive call—but, in my mind, that's a culmination, not a place to start.

We need to add pink boxes to this whole unit. --MF, 4/3/19

El patrón de ramificación de muchas plantas tiene una estructura fractal: las partes más pequeñas son como copias en miniatura de la planta completa.

Un fractal es un patrón repetido infinito formado por copias (o ligeras variaciones) de la misma forma. En esta imagen, la rama verde tiene (esencialmente) la misma forma que la imagen completa.

árbol fractal

  1. "U7L1-árbol"Comienza un proyecto nuevo llamado U7L1-Árbol
  2. Construyendo el primer nivel:
    1. Cree un bloque árbol 1. Parece sencillo, pero pronto se volverá más complicado.
      árbol 1 tamaño:(tamaño#){mover(tamaño) pasos; mover(-1*tamaño) pasos}
      PG: suggest redoing images so that the title is tree 1 size: (size), so that it later changes the hard coded numbers into a variable tree (level) size: (size). Then text needs to be brought in line.
    2. Apunta el objeto hacia arriba, baja el lápiz y ejecuta. Deberías obtener un resultado como este:árbol 1 tamaño:(50).
      resultado de árbol 1: dibujo del tronco del árbol
    3. Habla con tu compañero ¿Dónde comienza tu objeto? ¿En qué dirección está mirando? ¿Dónde se detiene?
  3. Usar árbol 1 para dibujar las ramas en árbol 2 es usar abstracción.
    Construye un bloque árbol 2 que utilice árbol 1 como sus ramas. Tamaño del árbol 1:(50)
    árbol2 tamaño:(tamaño#){mover(tamaño) pasos; girar (25) grados; árbol 1 tamaño:(tamaño*0.65); girar (25) grados; girar (35) grados; árbol 1 tamaño:(tamaño*0.85); girar (35); move(-1*tamaño) pasos}
  4. Habla con tu compañeroDescribe exactamente la posición y la dirección del objeto cuando el primer árbol 1 deja de ejecutarse. ¿Por qué es esencial para que funcione árbol 2?

Transparencia del estado (state transparency) : volver a poner todo (objeto, lápiz, etc.) exactamente como estaba cuando comenzaste, es importante cuando los bloques dependen de otros bloques. Por lo general, esto significa devolver el objeto a la misma posición y dirección, y el lápiz al mismo color y tamaño que tenían.

Paul and Mary want to use copy and paste here.
  1. Haz un bloque árbol 3 que use el bloque árbol 2 como ramas.
    Haz clic con el botón derecho del ratón (o control-clic en Mac) sobre un bloque para "duplicarlo" o "renombrarlo" para hacer estas tareas más rápido. Haz clic para mostrar un ejemplo.
    Needs better alt/title text. --MF, 6/18/20
    opción del menú para duplicar y renombrar
  2. Haz un bloque árbol 4 que use el bloque árbol 3 como ramas.
  3. Si lo deseas, crea un bloque árbol 5 que utilice el bloque árbol 4. Al ejecutar árbol 5 tamaño:(50) debería producir un resultado como este:
    resultado de árbol 5: árbol con tronco y ramas Es un buen momento para guardar tu trabajo

Todos estos bloques se ven esencialmente iguales excepto que árbol 5 usa árbol 4, mientras que árbol 4 usa árbol 3, y así sucesivamente. Entonces tiene sentido preguntarse si podemos reemplazar todos estos bloques con un solo bloque árbol, usando una variable para el número que cambia.

Usar un bloque dentro de sí mismo se llama recursividad (recursion) .

Aprendiste sobre la recursividad en Unidad 3 Laboratorio 1 Página 3: Usar la abstracción para anidar triángulos
  1. Esta es la idea general para la versión recursiva de árbol. Habla con tu compañero ¿Cuáles son las diferencias entre este programa de árbol recursivo y el código para árbol 2 y árbol 3, y por qué se necesitan estas diferencias?
    árbol nivel:(nivel#) tamaño:(tamaño#){mover(tamaño) pasos; girar (25) grados; árbol nivel:(nivel-1) tamaño:(tamaño*0.65); girar (25) grados; girar(35) grados; árbol nivel:(nivel-1) tamaño:(tamaño*0.85); girar (35); mover(-1*tamaño) pasos}
  2. Esto es lo que ocurre si ejecutas árbol, nivel: 9 tamaño: 50.
    dibujo de árbol sin fin, estancado en una sola rama
    Aún no funciona. Intenta depurar el programa y ejecutarlo por ti mismo. Habla con tu compañero ¿Qué está yendo mal?