TAD de las colas - Longitud de una cola
Utilizando el tipo abstracto de datos de las colas, definir las funciones
longitudCola :: Cola a -> Int
tal que longitudCola c
es el número de elementos de la cola c
. Por ejemplo,
longitudCola (inserta 4 (inserta 2 (inserta 5 vacia))) == 3
Soluciones
Se usará la función colaAlista
del ejercicio Transformaciones entre colas y listas.
A continuación se muestran las soluciones en Haskell y las soluciones en Python.
Soluciones en Haskell
import TAD.Cola (Cola, vacia, inserta, resto, esVacia) import Transformaciones_colas_listas (colaAlista) import Test.QuickCheck -- 1ª solución -- =========== longitudCola1 :: Cola a -> Int longitudCola1 c | esVacia c = 0 | otherwise = 1 + longitudCola1 rc where rc = resto c -- 2ª solución -- =========== longitudCola2 :: Cola a -> Int longitudCola2 = length . colaAlista -- Comprobación de equivalencia -- ============================ -- La propiedad es prop_longitudCola :: Cola Int -> Bool prop_longitudCola c = longitudCola1 c == longitudCola2 c -- La comprobación es -- λ> quickCheck prop_longitudCola -- +++ OK, passed 100 tests.
Soluciones en Python
from copy import deepcopy from typing import TypeVar from hypothesis import given from src.TAD.cola import (Cola, colaAleatoria, esVacia, inserta, resto, vacia) from src.transformaciones_colas_listas import colaAlista A = TypeVar('A') # 1ª solución # =========== def longitudCola1(c: Cola[A]) -> int: if esVacia(c): return 0 return 1 + longitudCola1(resto(c)) # 2ª solución # =========== def longitudCola2(c: Cola[A]) -> int: return len(colaAlista(c)) # 3ª solución # =========== def longitudCola3Aux(c: Cola[A]) -> int: if c.esVacia(): return 0 c.resto() return 1 + longitudCola3Aux(c) def longitudCola3(c: Cola[A]) -> int: _c = deepcopy(c) return longitudCola3Aux(_c) # 4ª solución # =========== def longitudCola4Aux(c: Cola[A]) -> int: r = 0 while not esVacia(c): r = r + 1 c = resto(c) return r def longitudCola4(c: Cola[A]) -> int: _c = deepcopy(c) return longitudCola4Aux(_c) # 5ª solución # =========== def longitudCola5Aux(c: Cola[A]) -> int: r = 0 while not c.esVacia(): r = r + 1 c.resto() return r def longitudCola5(c: Cola[A]) -> int: _c = deepcopy(c) return longitudCola5Aux(_c) # Comprobación de equivalencia # ============================ # La propiedad es @given(c=colaAleatoria()) def test_longitudCola_(c: Cola[int]) -> None: r = longitudCola1(c) assert longitudCola2(c) == r assert longitudCola3(c) == r assert longitudCola4(c) == r assert longitudCola5(c) == r # La comprobación es # src> poetry run pytest -q longitudCola.py # 1 passed in 0.28s