Donde vamos¶
- Se vieron dos estrategias para representar datos: inductiva y mediante gramáticas.
- Vimos que los programas que representan datos recursivos deben seguir su especificación:
- Caso base: El cual debemos terminar, dado que tiene respuesta inmediata.
- Caso recursivo: El cual nos impone componer una solución y llegar paulatinamente al caso base.
<tree-b> ::= <int> | <symbol> <tree-b> <tree-b>
; tree->list: tree-b -> list of numbers
; Propósito: Convierte un árbol binario (tree-b) en una lista plana de números.
; El árbol puede ser un número (hoja) o un símbolo con dos subárboles.
(define tree->list
(lambda (arb)
(cond
[(number? arb) (list arb)] ; Caso base: un número se convierte en una lista unitaria.
[else
; Caso recursivo: el árbol es un nodo con dos hijos.
; Se procesan recursivamente ambos subárboles y se concatenan los resultados.
(append
(tree->list (cadr arb)) ; Procesa el subárbol izquierdo (segundo elemento de la lista).
(tree->list (caddr arb)) ; Procesa el subárbol derecho (tercer elemento de la lista).
)
]
)
)
)
Pero observen algo: dependemos de las listas como estructuras, lo que implica:
null?: Predicado de la lista vacía.car,cadr,caddr,caar, etc.: Operaciones de listas.
En general, estamos dependiendo del tipo de dato, es decir, de las listas.