Los datos recursivos son aquellos que podemos representar usando recursión: - Caso base - Caso recursivo (inductivo)
Anotaciones - En lenguajes como C++ o Java los datos están representados en orden de bits (int 32) (long 64) (long long 128) - Lisp, Racket, Haskell, Earlang: Los datos recursivos: tail recursion. No tenemos limite para representar los datos, especialmente los numeros - Python, Ruby representan los datos como objetos
Ejemplos¶
Listas de numeros naturales¶
Multiplos de 7¶
Listas de multiplos de 8¶
Análisis del código:
#lang eopl
#|
Lista de los pares de multiplos de 6 y 8
4 e A, 6 e B, '() \in S
a e A -> a+6 e A
b e B -> b+8 e B
l e S y a e A y b e B -> (a :: b) :: l e S
|#
;;in-S? <lista de pares> -> boolean
(define in-S?
(lambda (exp)
(cond
[(null? exp) #T]
[(and
(in-A? (caar exp))
(in-B? (cadar exp))
)
(in-S? (cdr exp))]
[else
#F])))
;;in-A?: numero -> boolean
(define in-A?
(lambda (num)
(cond
[(= num 6) #T]
[(> num 6) (in-A? (- num 6))]
[else #F]
)))
;;in-B? numero -> boolean
(define in-B?
(lambda (num)
(cond
[(= num 8) #T]
[(> num 8) (in-B? (- num 8))]
[else #F]
)))
(define listaA '((4 8) (12 6) (20 24)))
(display (in-S? listaA))
(define listaB '((6 8) (12 32) (18 24)))
(display (in-S? listaB))
Estructura inductiva definida:
- Conjunto A: números múltiplos de 6 (comenzando desde 6)
- Conjunto B: números múltiplos de 8 (comenzando desde 8)
- Conjunto S: listas de pares donde cada par (a b) cumple \(a \in A\) y \(b \in B\)
Función in-S?:
1. (null? exp) #T - Caso base: lista vacía pertenece a S
2. Verifica que el primer elemento sea un par válido:
- (caar exp) extrae el primer elemento del primer par
- (cadar exp) extrae el segundo elemento del primer par
- Verifica que ambos pertenezcan a sus conjuntos respectivos
3. Si el primer par es válido, aplica recursión a (cdr exp) (resto de la lista)
4. Si cualquier par falla la validación, retorna #F
Función in-A?:
- Caso base: (= num 6) #T - 6 es el elemento base
- Paso recursivo: (> num 6) (in-A? (- num 6)) - resta 6 recursivamente hasta llegar al caso base
- Si num < 6: #F - no es múltiplo de 6
Función in-B?: - Misma estructura que in-A? pero con múltiplos de 8
Validación recursiva: La validación es posible porque: 1. Los conjuntos A y B están definidos inductivamente con casos base claros (6 y 8) 2. Las funciones verifican membresía restando el múltiplo hasta alcanzar el caso base 3. La estructura de S se define recursivamente: lista vacía + pares válidos concatenados 4. Cada llamada recursiva reduce el problema a una instancia más pequeña: - in-A?/in-B? reducen el número restando el múltiplo - in-S? procesa un elemento por llamada recursiva
Resultados:
- listaA: ((4 8) (12 6) (20 24)) → #F (4 no es múltiplo de 6)
- listaB: ((6 8) (12 32) (18 24)) → #T (todos los pares son válidos)