Estructuras iterativas
Concepto de composición iterativa
Una iteración o bucle es la repetición indefinida de ciertas acciones en función del
resultado de una condición
Entrada
Acción
Condición
Si
No
Salida
Un bucle debe ser finito, tener un inicio y un final, debemos conocer el final antes de
realizarlo. Las opciones del final de un bucle son:
- Longitud conocida o un numero máximo de repeticiones (*)
- Un centinela o marca de final del bucle (Una serie numérica que acabe con un
-1 o en una carrera ciclista, el coche escoba)
- La condición del último elemento (por ejemplo, calcular inversas de cuadrado
hasta que el valor sea más peuqño que 1/107
Secuencias
Una secuencia es una serie de valores (‘Hola, mundo’) puede ser finita (1,3,5,7,9) o
infinita de longitud desconocida (La serie de Fibonacci: 1,1,2,3,5,8,13,21,34,55... o
Potencias de n: 1,4,9,16,25,36,49...)
Las iteraciones se ralizan básicamente sobre secuencias y el ordenador no puede
trabajar con la secuencia por lo que lo hace elemento a elemento.
- Iteraciones sobre secuencias de longitud conocida: utilizaremos for:
Usa y trata cada elemento de la secuencia hasta llegar al final de la misma
Bucles
- Secuencias de longitud conocida: Por ejemplo cadenas o secuencias de
caracteres
- Se impone el numero máximo de iteraciones que será el número de elementos
de la secuencia
- El iterador solo accede a un elemento de la secuencia en cada momento
- Los elementos de la secuencia se tratan de forma ordenada de inicio a fin
Ejemplo: Hay sólo 6 iteraciones. La variable caracter empieza por tomar el valor del
primer elemento de la secuencia (‘p’) y luego toma en cada iteración el valor del
siguiente elemento de la secuencia hasta completar la misma.
Ejemplo: Contar vocales de una frase
- La estructura for irá iterando sobre cada una de las letras de la secuencia de
caracteres. En el momento que una letra sea una vocal, la imprimirá por la
pantalla.
Secuencias de caracteres – Funciones asociadas
Índices en cadenas de caracteres
- Son estructuras organizadas de caracteres simples. Su tratamiento pasa por
una variables estructurada que puede referenciarse cada uno de sus caracteres
mediante índices.
- Nuneran cada uno de los elementos de izquierda a derecha y empezando por
cero(0). Así se permite acceder a los elementos por su indice y no
secuencialmente. Se puede acceder también de derecha a izquierda mediante
índices negativos.
- Para la secuencia s, s[i] indica el elemento con índice i de la secuencia.
- Así por ejemplo, len(s) = 9, el ultimo elemento es el índice 8 o -1s[8]=”I”, s[-
1]=”I”
S U N I V E R S A L
Indice positivo 0 1 2 3 4 5 6 7 8
Índice negativo -9 -8 -7 -6 -5 -4 -3 -2 -1
Indexación y segmentación de las cadenas de caracteres
- Es una operación que se relaiza sobre un string o una lista. El operador permite
extraer partes de la estructura en una subestructura.
- Por ejemplo, de la secuencia ‘Hola, que tal’ extraer solo los elementos pares
‘hl,qetl’
- En la documentación del lenguaje, se explica la sintaxis de los operadores de
segmentación.
En los casos de s[i:j] y s[i:j:k]
- Si i no se indica, i toma el valor 0 s[:4] es s[0:4]
- Si j no se indica, toma el valor de len(s) s[4:] es s[4:len(s)]
- Si k no se indica, toma el valor 1
Secuencias numéricas
Python tiene funciones que generan automáticamente secuencias numéricas de
diferentes tipos (iteradores) y según las caracterisiticas que pueda definir el
programador.
“range” es una función iteradora predefinida que actua generando una serie
secuencial de valores según los parámetros que le son introducidos.
Sintaxis: range([desde,]hasta[,interv])
Range genera una serie de números enteros empezando por el marcado desde y
acabando hasta -1 incrementándose en valores de interv.
- Si desde no se indica, se asume por defecto el valor cero (0)
- Si interv no se indica, se asume por defecto el valor 1
- El valor de hasta es siempre obligado
- Si solo se indican dos, seran los de desde y hasta
Ejemplos:
o range(5) (0,1,2,3,4)
o range(2, 10) (2,3,4,5,6,7,8,9)
o range(2, 10, 2) (2, 4, 6, 8)
o range(10, 0, 2) ()
Esquemas secuenciales
Los esquemas secuenciales son esquemas iterativos que nos permiten modelar
soluciones a diferentes problemas. Son unos métodos base que se tienen que refinar al
problema concreto que se está solucionando.
Hay de dos tipos:
- Recorrido
- Búsqueda
Esquemas de recorrido
Es el esquemas más basico y comun, se realiza la inspección de TODOS los elementos
de la secuencia. Al finalizar la secuencia se presentan los resultados.
La secuencia debe ser finita y debe tener un final conocido.
Ejemplo: cuantas “a” hay en una frase o secuencia de caracteres de texto?
Secuencias
Como recorremos las secuencias? Tenemos dos métodos:
- Método 1: Acceso directo a los elementos de la secuencia
La secuencia que se recorre aquí son los
elementos de la secuencia o variable t
‘h’, ‘o’, ‘l’ y ‘a’
- Método 2: Acceso indirecto a través de su posición índice
La secuencia aquí es una
secuencia numérica que se
inicia en cero y acaba en
len(t)-1, o sea, 0,1,2 y 3. La
secuencia no son los
elementos de t sino los
numeros 0, 1, 2, 3. Los
elementos de t los podemos
extraer a traves de la
expresión “t[i]”
En todos los casos se puede acceder con el método directo a los elementos de una
secuencia pero accederemos a este método sólo cuando recorramos únicamente una
secuencia y necesitemos conocer su contenido independientemente de su posición en
la misma.
Siempre y en cualquier caso podemos acceder de manera indirecta, sólo en casos
concretos solucionaremos el problema accediendo indirectamente a través de su
índice o posición.
Podremos resolver el problema , por ejemplo, para:
- Saber la posición de un elemento de la secuencia (en una búsqueda)
- Buscar diferencias entre dos secuencias
- Intercalar o fusionar dos secuencias
- Acceder a más de un elemento de la secuencia al mismo tiempo como, por
ejemplo, saber un elemento y el siguiente cumplen con una característica
común
- Cualquier método que nos obligue a trabajar con más de una secuencia al
mismo tiempo
EJEMPLOS:
Esquemas de búsqueda
Terminar la secuencia cuando se haya cumplido con el objetivo (lo antes posible).
Hay dos premisas importantes:
- No es necesario seguir recorriendo el resto de la secuencia: Cuando al recorrer
la secuencia conseguimos el objetivo, no necesitamos seguir revisando más
elementos. (ex: buscar nuestro coche en el aparcamiento)
- A diferencia del equema de recorrido, no acaba con una única respuesta, sino
que puede acabar siempre de dos maneras diferentes:
o Porque existe el elemento que cumple con el objetivo
o Porque no existe ningún elemento que cumpla con el objetivo
Solución 1: Se recorre la secuencia hasta que se encuentra un elemento que cumple
con el objetivo deseado o una condición determinada. En este momento la secuencia
termina, el resto de elementos no se recorren y se termina el recorrido de la secuencia
Solución 2: Sin embargo puede pasar que el eobjetivo que se busca no se encuentre en
la secuencia. Se recorrerá toda la secuencia y se informa de que no hay ningun
objetivo que cumpla con el objetivo marcado.
El numero de elementos tratados en la secuencia debe ser finito.
Ejemplo:
Esquemas secuenciales:
Antes de empezar a escribir el programa debemos:
- Entender la noción de secuencia de valores
- Dado el problema, averiguar la secuencia subyacente (en algunos casos puede
resultar obvio, pero en otros casos no lo es tanto) y determinar cuál es su final.
- Elegir el esquema que hay que aplicar para resolver el problema (recorrido o
búsuqeda)
- Refinar el eaquema para el problema concreto:
o Decidir el conjunto de variables que van a intervenir en la solución del
problema. A parte de las variables de entrada y salida, harán falta más
para efectua<r cálculos intermedios y para “visitar” los elementos de la
secuencia.
o Sustituir las partes generales del esquema por acciones y expresiones
que resuelvan el problema planteado.