110 likes | 332 Views
Agenda Clase 6. Iteradores. Enumeración sin iteradores. Loops lógicos. Recursión vs. Iteración. Recursión de Cola. Orden de Evaluación Normal y Aplicativo. No determinismo. Iteradores. Generalizan los loops controlados por enumeración. Son utilizados para enumerar los
E N D
Agenda Clase 6 • Iteradores. • Enumeración sin iteradores. • Loops lógicos. • Recursión vs. Iteración. • Recursión de Cola. • Orden de Evaluación Normal y Aplicativo. • No determinismo.
Iteradores • Generalizan los loops controlados por enumeración. • Son utilizados para enumerar los elementos de conjuntos bien definidos. • Clu permite la definición de iteradores sobre cualquier conjunto de tipo abstracto de datos para enumerar sus items.
Iteradores: Ejemplo en Clu Definición del Iterador from_to_by = iter(from, to, by:int) yields (int) i:int:=from if by>0 then while i<=to do yield i i +:= by end; else while i>=to do yield i i+:=by end end end from_to_by for i in from_to_by(first, last, step) do ... end paso de iteración positivo -incremento- paso de iteración negativo -decremento- Invocación del Iterador
Iteradores: Generadores en Icon • Icon denomina generadores a los iteradores y los utiliza igual que Clu para la iteración controlada por enumeración. every i:= first to last by step do {…} • Dado que Icon fue diseñado para la manipulación de Strings, los iteradores se utilizan en la manipulación de datos de este tipo.
Enumerando sin iteradores • Incapacidad del stack para el control en las subrutinas debido a la gran cantidad de saltos desde y hacia el punto de llamada. • Convenciones de programación que simulan el efecto de los iteradores sacrificando con ello cierto grado de elegancia en el código.
Loops Controlados Lógicamente • La implementación más común es pre-test while <condición> do <instrucción> • Ni Fortran ni Algol proveen constructor while y para imitarlo se debe recurrir al goto. • También pueden definirse loops post-test a través de la sentencias: repeat <instrucción> until <condición> (Modula y Pascal) do <instrucción> while <condición> (en C) • Es recomendable implementar los mid-test loop explotando las herramientas que para tales fines brinde el lenguaje: when <condición> exit (Modula) if <condición> exit (Modula 2) break (C, C++, Java)
Recursión vs. Iteración • La recursión no requiere sintáxis especial más allá de que las funciones puedan llamarse a si mismas o invocar a otras funciones que las llame. • Cualquier algoritmo iterativo puede escribirse recuersivamente y viceversa. • Ambos enfoques tienen la misma capacidad de cómputo. • La recursión es más natural en lenguajes funcionales y la iteración en lenguajes imperativos.
Recursión de Cola: ejemplo en Scheme. • Versión sin recursión de cola (define summation (lambda (f low high) (if (= low high) (f low) (+ (f low) (summation f (+ low 1) high))))) • Versión con recursión de cola (define sum (lambda (f low high subtotal) (if (= low high) (+ subtotal (f low)) (sum f (+ low 1) high (+ subtotal f (low)))))) sum (f low high 0) Invocación inicial
Orden de Evaluación Aplicativo y Normal • Orden Aplicativo: los parámetros son evaluados antes de ser pasados a una subrutina. • Orden Normal: los parámetros son evaluados sólo cuando es necesario. Ej: macros en C.
No Determinismo • La escogencia entre alternativas no está especificada deliberadamente. • Se vale de condiciones comandos de guardia. • Más de dos alternativas ciertas a la vez implican el uso de un if aunque esto tenderá a favorecer una opción sobre la otra. • Alternativa: listas circulares • Alternativa 2: asignación de números aleatorios u otros mecanismos heurísticos.