El caso base

En esta página, aprenderá cómo evitar que la recursión continúe indefinidamente.

Parecía tener sentido reemplazar todas las secuencias de comandos de árbol numeradas similares con una única secuencia de comandos recursiva con la misma estructura:
á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); mover(-1*tamaño) pasos}  árbol 3 tamaño:(tamaño#){mover(tamaño) pasos;girar (25) grados; árbol 2 tamaño:(tamaño*0.65);girar(25) grados;girar(35) grados; árbol 2 tamaño:(tamaño*0.85);girar (35); mover(-1*tamaño) pasos}       ...        á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}

Pero no funcionó:
dibujo de árbol que nunca se termina, estancado en una sola rama

Jasmine: Ejecuté árbol, nivel 9 tamaño 50, pero miren lo que ocurrió. ¿Qué está yendo mal?
Morgan: ¡Nunca se detiene!
Omar: Después de girar a la izquierda, debería formar un árbol más pequeño, pero luego se supone para terminar y girar a la derecha y hacer un árbol, allí también.
Jasmine: ¡Cierto! No está girando a la derecha en absoluto.
Omar: Sí, en cada llamada recursiva a árbol, el objeto dibuja ramas izquierdas cada vez más pequeñas hasta que parece estar girando en un solo lugar. Nunca dibuja una rama derecha para terminar el árbol en el que está trabajando.
Morgan: ¡Miren esto! El bloque árbol 1 es diferente a los demás; simplemente dibuja una línea, sin ramas, y vuelve a poner el objeto donde empezó.

Morgan señala el código de árbol 1 y la figura que dibuja.
árbol 1 tamaño:(tamaño#){mover(tamaño) pasos; mover(-1*tamaño) pasos} resultado de árbol 1: dibujo del tronco de un árbol

Jasmine: ¡Así que nuestro bloque de árbol recursivo tiene que hacer algo diferente en el nivel más bajo!
Omar: ¡Sí! Tiene que dibujar solo una línea sin agregar otra rama.
: Caso base

Esta versión diferente para el nivel más bajo de un script recursivo se denomina caso base (base case).

  1. Corrige su bloque árbol recursivo para que incluya un caso base para evitar que el programa se llame a sí mismo para siempre.
    Haz clic para mostrar una pista

    On Unidad 3 Laboratorio 1 Página 3: Usar abstracción para anidar triangulos, solo dibujabas el triángulo anidado si tamaño > 9. Esa es una de las formas de impedir que la recursividad continue para siempre. Haz clic aquí para ver una pista más detallada.

    Aquí hay dos formas con las que podrías hacer eso, y hay más. Usa la que tenga más sentido para ti.
    if(nivel=1){mover(tamaño) pasos; mover(-1*tamaño) pasos}sino{...Contruye más ramas...} mover(tamaño) pasos; si(nivel>1){...Construye más ramas...}; mover(-1*tamaño) pasos

  2. Prueba tu código. Ejecuta nivel de árbol: 9 tamaño: 50. Si ahora funciona correctamente, deberías obtener un resultado como este.
    árbol con tronco y 8 niveles de ramas
Hablen en turnos

Los programas recursivos se llaman a sí mismos. Para que se detengan, debe haber algún caso especial en el que no se llamen a sí mismos. Lo llamamos el caso base, una versión más simple del programa que no llama al bloque en sí mismo.

Por lo general, hay un condicional con dos casos: un caso base para el nivel más bajo que detiene la recurrencia para siempre y un caso recursivo que llama al propio programa una y otra vez en niveles inferiores hasta que llega al caso base.

Cuando un bloque sigue llamándose a sí mismo recursivamente para siempre (como cuando el objeto estaba dando vueltas en un solo lugar), eso es un error, y decimos que el programa está atascado en un bucle infinito.

  1. Habla con tu compañeroObserva el programa de árbol recursivo. Identifica el caso base y dialoguen sobre cómo funciona la recursividad en este programa.
  2. ¿árbol se ejecuta en un tiempo razonable o irrazonable? Reflexiona un poco sobre esto; podrías probar a medir el tiempo que toma el programa para los niveles del 8 al 12, o podrías crear una variable global contar y agregarla primero al bloque árbol para registrar el número de veces que se llama al procedimiento para árboles en diferentes niveles.
    Aprendiste sobre tiempo razonable e irrazonable en Unidad 5 Laboratorio 3: Algoritmos de clasificación.