Árbol de profundidad n con nodos iguales

El árbol binario

se puede representar por

El tipo de los árboles binarios se puede definir por

Definir las funciones

tales que

  • repeatArbol x es es árbol con infinitos nodos x. Por ejemplo,

  • replicate n x es el árbol de profundidad n cuyos nodos son x. Por ejemplo,

Comprobar con QuickCheck que el número de hojas de replicateArbol n x es 2^n, para todo número natural n.
Soluciones

A continuación se muestran las soluciones en Haskell y las soluciones en Python.


Soluciones en Haskell


Soluciones en Python

2 Comentarios

  1. Para definir la función repeatArbol, podemos usar recursión infinita:

    Para definir la función replicateArbol, podemos usar una función auxiliar que construye un árbol de profundidad n y cuyos nodos son x:

    Para comprobar que el número de hojas de replicateArbol n x es 2^n para todo número natural n, podemos usar QuickCheck y la función leaves, que cuenta el número de hojas de un árbol:

    Ejecutamos QuickCheck para comprobar la propiedad:

    Pregunta ¿Y el generador de los árboles para QuickCheck?

    Respuesta Para poder usar QuickCheck con la estructura de datos Arbol, necesitamos definir un generador de árboles. Una forma de hacerlo es usar la siguiente función:

    Esta función toma un generador de elementos (de tipo a) y devuelve un generador de árboles de elementos de tipo a. El tamaño del árbol se determina por la función getSize. Si el tamaño es 0, se devuelve un árbol hoja con el elemento generado. Si el tamaño es mayor que 0, se generan dos árboles más pequeños y se combinan en un árbol con un nodo interno.

    Por ejemplo, podemos usar este generador para generar árboles de números enteros aleatorios:

    Podemos usar este generador en la propiedad prop_replicateArbol para hacer pruebas aleatorias:

    Pregunta ¿No hay que declarar Arbol una instancia de Arbitrary?

    Respuesta Sí, para poder usar QuickCheck con la estructura de datos Arbol, es necesario declararla una instancia de la clase Arbitrary. Esto se hace mediante la siguiente definición:

    La primera parte de la instancia especifica cómo generar árboles aleatorios usando el generador genArbol. La segunda parte especifica cómo reducir el tamaño de un árbol durante el proceso de minimización de QuickCheck. En este caso, se reduce el tamaño de un árbol convirtiéndolo en un árbol hoja o reduciendo el tamaño de sus hijos.

  2. Para resolver este problema, podemos definir la función replicateArbol utilizando recursión. Si n es cero, entonces el árbol es un nodo hoja con valor x. Si n es mayor que cero, entonces el árbol es un nodo con valor x y dos subárboles, cuyos valores también son x, y cuyas profundidades son n – 1. Esto se puede implementar de la siguiente manera:

    Para comprobar con Hypothesis que el número de hojas de replicateArbol(n, x) es 2^n, podemos utilizar la siguiente función de prueba:

    La función contarHojas recorre el árbol y cuenta el número de nodos hoja que encuentra. La función de prueba test_replicate_arbol utiliza la función contarHojas para comprobar que el número de hojas del árbol generado por replicateArbol es 2^n.

    Para ejecutar estas pruebas con Hypothesis, debemos instalar la biblioteca y luego ejecutar el siguiente comando:

Escribe tu solución