Anda di halaman 1dari 29

Estrategias

de programacin y estructuras de datos


Grado en Ingeniera Inform8ca
Grado en Tecnologas de la Informacin

Departamento de Lenguajes y Sistemas inform6cos

Estrategias de
programacin

Algoritmos iteraDvos y recursivos

Javier Vlez Reyes Jos Ignacio Mayorga Toledano


jvelez@lsi.uned.es
nmayorga@lsi.uned.es
Departamento de Lenguajes Y Sistemas InformDcos
UNED

Estrategias de programacin
ndice

ndice

Introduccin

Diseo de algoritmos recursivos

2-2

Qu son los algoritmos recursivos?

Diseo de algoritmos recursivos

Ejemplos de algoritmos recursivos

Diseo de algoritmos iterativos

Qu son los algoritmos iterativos?

Diseo de algoritmos iterativos

Ejemplos de algoritmos iterativos

Traduccin de algoritmos recursivos a iterativos

Catlogo de algoritmos

Bibliografa

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Obje6vos generales

Obje8vos

2-3

Entender las principales caractersticas del diseo recursivo

Entender las ventajas y desventajas del diseo recursivo

Aprender a disear algoritmos recursivos

Advertir su importancia en el contexto de las abstracciones de datos

Entender las principales caractersticas del diseo iterativo

Entender las ventajas y desventajas del diseo iterativo

Aprender a disear algoritmos iterativos

Advertir su importancia en el contexto de las abstracciones de datos

Aprender a transformar algoritmos recursivos en iterativos

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Introduccin

Introduccin
Todo algoritmo pretende la realizacin de algn 6po de tarea o clculo. Las ms de las
veces, si dicha tarea no es trivial, esto implica repe6r un conjunto de pasos sencillos un
cierto nmero de veces hasta que se cumpla cierta condicin, que se conoce como
condicin de terminacin. Esencialmente, hay dos formas de disear algoritmos que
desarrollen tareas repe66vas, que veremos en este tema ya que representan estrategias
diferentes para resolver el mismo problema: la recursividad y la iteracin
I. Diseo recursivo de algoritmos

Estrategias de
programacin

El problema se resuelve por el diseo de funciones que recurren sobre si


mismas de forma directa o indirecta. Su construccin se basa en la eleccin
de una familia de casos base, triviales de resolver y una coleccin de casos
recursivos que converjan hacia los casos base y que en suma den cobertura
a todo el espectro de posibles parmetros de entrada
II. Diseo iterativo de algoritmos
El problema se resuelve por aplicacin de sentencias de control de ujo de
programa sobre estructuras de datos que representan la entrada o salida
del mismo. En este caso la llamada a otra funciones dentro de una funcin
se debe a criterios de descomposicin modular y no se aplica recursividad
para resolver el problema

2-4

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Introduccin

Introduccin
I. Diseo recursivo
Los algoritmos de diseo recursivo permiten resolver un problema
invocando dentro del cuerpo de una funcin directa o
indirectamente nuevamente a la propia funcin sobre un conjunto
de parmetros actuales diferentes. Un diseo adecuado de este 6po
de algoritmos debe garan6zar que la ejecucin de la funcin con unos
parmetros adecuados converja a la solucin de manera que se
garan6ce la nalizacin del mismo
int factorial (int n) {
if (n == 0) return 1;
else return n * factorial (n 1);
}

Diseo iterativo

2-5

Diseo recursivo

Para resolver la funcin


factorial se vuelve a
invocar a la funcin
factorial con valor n 1 y
se devuelve el resultado de
multiplicar el valor devuelto
de esta invocacin por n

Factorial (5) = 5 * factorial (4)


= 5 * 4 * factorial (3)
= 5 * 4 * 3 factorial (2)
= 5 * 4 * 3 * 2 * factorial (1)
= 5 * 4 * 3 * 2 * 1 * factorial (0)
= 5 * 4 * 3 * 2 * 1 * 1
= 120

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Introduccin

Introduccin
I. Diseo iterativo

Diseo iterativo

Los algoritmos itera6vos son aquellos que se construyen a par6r de


una secuencia ordenada de instrucciones de alto nivel. Un
subconjunto de estas instrucciones permiten alterar el ujo de
ejecucin. En concreto se dis6nguen instrucciones de control de ujo
condicional que seleccionan un camino de ejecucin de entre varios
posibles e itera6vo que repiten la ejecucin de un bloque de
instruccin mientras se sa6sfagan ciertas condiciones ambientales. Un
diseo adecuado de este 6po de algoritmos debe garan6zar la
terminacin del mismo
int factorial (int n) {
int index = 1;
int result = 1;
while (index <= n) {
result = result * index;
index ++;
}
}
Factorial (5)

Diseo recursivo

Para resolver la funcin factorial


se procede iterativamente
acumulando en la variable result
el producto del contador index de
cada iteracin por el resultado
acumulado anterior

index 1 2 3 4 5
result 1 2 6 24 120
2-6

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Diseo de algoritmos recursivos

Qu son los algoritmos recursivos?


Un algoritmo recursivo es aquel que se invoca a si mismo dentro de su propio cuerpo con
unos parmetros actuales dis6ntos. Estructuralmente cada funcin est formada por una
coleccin de alterna6vas disjuntas llamadas casos con guardas expresadas en trminos de
los parmetros del problema. Los casos base resuelven el problema de forma inmediata
mientras que los otros recurren composi6vamente sobre la funcin

Esquema general de un algoritmo recursivo


Funcin recursiva

Casos
El diseo
requiere la
denicin de
una coleccin
de casos que
den cobertura a
toda entrada
leg6ma de
parmetros

2-7

Tr funcin (Tx x) {

if (esCasoBase1 (x)) return <<resolucin inmediata 1>>
...
Casos base
if (esCasoBaseN (x)) return <<resolucin inmediata N>>

if (esCasoRecursivo1 (x)) return <<resolucin recursiva convergente 1>>
...
if (esCasoRecursivoM (x)) return <<resolucin recursiva convergente M>>

}

Guarda
La guarda del caso reeja las condiciones
ambientales que deben sa6sfacerse para
ejecutar el caso. Estn expresadas en trminos
de los parmetros y deben ser disjuntas entre s

Casos recursivos

Resolucin
La resolucin de un caso indica las acciones que deben
efectuarse para resolver el caso. Si es base la resolucin
es inmediata si es recursiva consiste en la aplicacin de
una composicin de llamadas recursivas

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Diseo de algoritmos recursivos

Diseo de algoritmos recursivos


Como hemos visto, la tarea de diseo de una funcin recursiva consiste en la denicin de
la coleccin de casos base y casos recursivos que resuelvan sa6sfactoriamente el problema.
A con6nuacin discu6mos el correcto diseo de cada 6po de caso

Diseo de casos base


Un caso base representa el nal de una tarea, ya que no requiere de nuevas llamadas
recursivas para su resolucin debido a su sencillez. Cuando diseamos los casos base de
un algoritmo recursivo debemos asegurarnos de que las guardas de todos ellos son
disjuntas entre s y de que en suma dan cobertura a todas las posibles invocaciones
provenientes de algn caso recursivo
Caso base

Toda invocacin recursiva termina


por aplicacin del nico caso base
con guarda n==0. A veces es
posible balancear los casos de un
diseo recursivo entre los base y
los propiamente recursivos sin
impacto en la solucin. Considere
que otra solucin hubiera sido
denir el caso base con la guarda
n<2

2-8

int factorial (int n) {


if (n == 0) return 1;
else return n * factorial (n 1);
}

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Diseo de algoritmos recursivos

Diseo de algoritmos recursivos


Como hemos visto, la tarea de diseo de una funcin recursiva consiste en la denicin de
la coleccin de casos base y casos recursivos que resuelvan sa6sfactoriamente el problema.
A con6nuacin discu6mos el correcto diseo de cada 6po de caso

Diseo de casos recursivos


Un caso recursivo consta de tres elementos: una divisin del problema en uno o ms
subproblemas, una invocaciones recursiva para resolver cada uno de estos subproblemas
y una combinacin de los resultados de los subproblemas para obtener, a la vuelta de las
invocaciones recursivas, el resultado del problema original. Este esquema termina si la
divisin del problema converge hacia alguno de los casos base de la funcin

Divisin

Caso recursivo

Aqu el nico caso recursivo es


aquel con guarda implcita n>0. Su
resolucin consiste en una divisin
convergente hacia n==0 debido a
la expresin de divisin del
problema

La funcin de divisin
genera a cada paso de
if (n == 0) return 1;
recursin un subproblema
else return n * factorial (n 1); de tamao una unidad
menor que converge a 0
}
int factorial (int n) {

Recursin

Combinacin

La funcin de combinacin en este caso


que permite resolver el problema a par6r
de los resultados parciales de cada
subproblema es la operacin producto
2-9

La recursin se aplica para


resolver el subproblema de
tamao n-1

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Diseo de algoritmos recursivos

Diseo de algoritmos recursivos


Como hemos visto, la tarea de diseo de una funcin recursiva consiste en la denicin de
la coleccin de casos base y casos recursivos que resuelvan sa6sfactoriamente el problema.
A con6nuacin discu6mos el correcto diseo de cada 6po de caso

Diseo de casos recursivos


Un caso recursivo consta de tres elementos: una divisin del problema en uno o ms
subproblemas, una invocaciones recursiva para resolver cada uno de ellos y una
combinacin de los resultados de los subproblemas para obtener, a la vuelta de las
invocaciones recursivas, el resultado del problema original.

I. Por la forma de recursin
Recursividad simple

El nmero de invocaciones realizadas


en cada caso recursivo marca un
Recursividad mltiple
criterio de clasicacin
Clasificaciones
de recursividad

II. Por la forma de particin


Particin por substraccin
La forma de dividir el problema en
subproblemas es otro criterio de
Particin por divisin
clasicacin
III. Por la forma de combinacin

Recursividad final

La forma de combinar los resultados


parciales de la resolucin de cada
Recursividad no final
subproblema es el tercer criterio
2 - 10

return n * f (n-1)
return f (n-1) + + f (n-k)
return n * f (n-1)
return f (n/2)
return f (n/2)
return n * f (n-1)

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Diseo de algoritmos recursivos

Diseo de algoritmos recursivos


Como hemos visto, la tarea de diseo de una funcin recursiva consiste en la denicin de
la coleccin de casos base y casos recursivos que resuelvan sa6sfactoriamente el problema.
A con6nuacin discu6mos el correcto diseo de cada 6po de caso

Diseo de recursividad por inmersin


A veces el diseo de una funcin recursiva se expresa como una invocacin concreta de
una funcin ms general que incluye parmetros adicionales. Esta tcnica, conocida por
el nombre de diseo por inmersin, se aplica por dis6ntas cues6ones que discu6remos a
con6nuacin
La inmersin es una estrategia de diseo mediante la cual
una funcin se expresa como una invocacin particular de
otra funcin ms general con parmetros adiciones

Funcin sumergida

La funcin sumergida
se expresa como una
invocacin concreta de
la funcin inmersora
ms general

2 - 11

int sumaTodos (int v[]) {


return sumaDesde (v, 0);
}

int sumaDesde (int v[], int index) { ... }

Funcin inmersora

L a f u n c i n i n m e r s o r a
sumerge a la original puesto
que, al ser ms general, con
una invocacin par6cular de
sta se da cobertura al
problema

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Diseo de algoritmos recursivos

Diseo de algoritmos recursivos


Como hemos visto, la tarea de diseo de una funcin recursiva consiste en la denicin de
la coleccin de casos base y casos recursivos que resuelvan sa6sfactoriamente el problema.
A con6nuacin discu6mos el correcto diseo de cada 6po de caso

Diseo de recursividad por inmersin


A veces el diseo de una funcin recursiva se expresa como una invocacin concreta de
una funcin ms general que incluye parmetros adicionales. Esta tcnica, conocida por
el nombre de diseo por inmersin, se aplica por dis6ntas cues6ones que discu6remos a
con6nuacin

Tctica de
inmersin

I. Inmersin de parmetros
La inmersin de parmetros se reere a la
aplicacin de la tcnica de inmersin sobre
los parmetros de entrada de la misma.
Existen 2 6pos dentro de esta categora

I.I. Parmetros de recorrido


Se incluyen parmetros en la funcin de
inmersora que controlan el recorrido de los
elementos de una estructura de datos
I.II. Parmetros acumuladores
Se incluyen parmetros en la funcin de
inmersora que acumulan resultados inter-
medios

II. Inmersin de resultados


La inmersin de resultados consiste en la
aplicacin de la tcnica de la inmersin para
acumular en parmetros el resultado del
problema en llamada recursiva
2 - 12

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Diseo de algoritmos recursivos

Diseo de algoritmos recursivos


Como hemos visto, la tarea de diseo de una funcin recursiva consiste en la denicin de
la coleccin de casos base y casos recursivos que resuelvan sa6sfactoriamente el problema.
A con6nuacin discu6mos el correcto diseo de cada 6po de caso

Diseo de recursividad por inmersin


A veces el diseo de una funcin recursiva se expresa como una invocacin concreta de
una funcin ms general que incluye parmetros adicionales. Esta tcnica, conocida por
el nombre de diseo por inmersin, se aplica por dis6ntas cues6ones que discu6remos a
con6nuacin
I. Inmersin por diseo
Se aplican tcnicas de inmersin con el objeto de denir
una recursin que de otro modo no sera posible ar6cular

Objetivos de
inmersin

II. Inmersin por eficiencia


Se aplican tcnicas de inmersin con el n de conseguir
una ejecucin ms eciente de la funcin en la resolucin
del problema
III. Inmersin por recursin final
Se aplican tcnicas de inmersin con el nimo de
transformar la recursividad en recursin nal

2 - 13

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Diseo de algoritmos recursivos

Diseo de algoritmos recursivos


Como hemos visto, la tarea de diseo de una funcin recursiva consiste en la denicin de
la coleccin de casos base y casos recursivos que resuelvan sa6sfactoriamente el problema.
A con6nuacin discu6mos el correcto diseo de cada 6po de caso

Diseo de recursividad por inmersin


A veces el diseo de una funcin recursiva se expresa como una invocacin concreta de
una funcin ms general que incluye parmetros adicionales. Esta tcnica, conocida por
el nombre de diseo por inmersin, se aplica por dis6ntas cues6ones que discu6remos a
con6nuacin
Tctica

Objetivos

Diseo

Eficiencia

R. Final

2 - 14

Recorrido

Acumulacin

Resultados

S e a p l i c a p a r a o b t e n e r
recurrencias con estructuras de
datos est6cas o parmetros
constantes durante la ejecucin

Esta tc6ca de inmersin se aplica


para precalcular y acumular un
valor de entrada de manera que se
ahorre en 6empo o memoria

S e i n c l u y e n p a r m e t r o s d e
acumulacin para evitar tener que
combinar tras la ejecucin de las
recursiones de cada subproblema

-
-

Esta tc6ca de inmersin se aplica


para calcular y u6lizar un resultado
parcial, que viene de una llamada
posterior en la cadena recursiva

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Diseo de algoritmos recursivos

Diseo de algoritmos recursivos


Como hemos visto, la tarea de diseo de una funcin recursiva consiste en la denicin de
la coleccin de casos base y casos recursivos que resuelvan sa6sfactoriamente el problema.
A con6nuacin discu6mos el correcto diseo de cada 6po de caso

Ejercicios
I. Funcin factorial

II. Serie de fibonacci

Disee una funcin que calcule el


factorial de un nmero. Determine el
6po de recursividad de que se trata
segn las 3 clasicaciones anteriores

IV. Suma de N naturales


Disee una funcin recursiva que
calcule la suma de los n primeros
nmeros naturales. Es recursiva
simple? es nal?

VII. Bsqueda en vector


Disee una funcin recursiva que
busque un elemento dentro de un
vector de enteros. Clasique la
funcin

2 - 15

Cada valor de la serie de bonacci se


ob6ene a par6r de la suma de los dos
anteri ores. Los dos pri meros
elementos de la serie son 1

V. Suma de un vector
Disee una funcin recursiva que
calcule la suma de los n primeros
elementos de un vector de enteros.
Clasique la funcin

VIII. Elementos repetidos


Disee un predicado recursivo que
determine si un vector de enteros
con6ene o no algn elemento
repe6do

III. Potencia de un nmero


Calcule la n-esima potencia de un
nmero mediante el diseo de una
funcin recursiva. Clasique el diseo
con respecto a los criterios anteriores

VI. Producto escalar


Disee una funcin recursiva que
calcule el producto escalar de dos
vectores de enteros. Clasique la
funcin

IX. Mximo comn divisor


Disee una funcin recursiva que
calcule el mximo comn divisior
entre dos enteros por aplicacin del
algoritmo de Euclides

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Diseo de algoritmos itera6vos

Qu son los algoritmos itera8vos?


En los algoritmos itera6vos los problemas se resuelven mediante la escritura de una
coleccin de instrucciones de propsito especco que se ejecutan de manera secuencial
segn el orden en que se han escrito. Algunas de estas instrucciones permiten alterar el
control secuencial de la ejecucin para ar6cular ujos itera6vos o condicionales de
ejecucin

Esquema general de un algoritmo itera8vo


Inicializacin
int est (T[] v, T e) {
int index = 0;
boolean found = false;

La inicializacin es el paso
preliminar para proceder con el
diseo itera6vo de algoritmos

Iteracin while (!found && index < v.length) {

Los algoritmos itera6vos basan su


funcionamiento en iteraciones de
bloques de cdigo generalmente
aplicadas sobre elementos de
estructuras de datos

found = (v [index] == e);

Bifurcacin

if (!found) index++;

Las instrucciones de control de


ujo condicional permiten ejecutar
sentencias solo bajo determinadas
condiciones ambientales

}
if (found) return index;
else return -1;
}

Secuenciamiento

La caracters6ca esencial del diseo itera6vo radica en el


concepto de secuencia de instrucciones ejecutadas en orden
y en el uso de variables para acumular estados parciales
2 - 16

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Diseo de algoritmos itera6vos

Diseo de algoritmos itera8vos


El diseo itera6vo u6liza instrucciones que prescriben cmo realizar los clculos o tareas
necesarias para llegar al resultado buscado. Estas instrucciones se ejecutan de acuerdo a
ujos de ejecucin, que pueden ser secuenciales, bifurca6vos e itera6vos. La u6lizacin de
variables y la sentencia de asignacin juegan un papel preponderante

Elementos de los
algoritmos
iterativos

Elementos de un algoritmo itera88vo

2 - 17

I. Sentencias de asignacin
La sentencia de asignacin juegan un papel preponderante en el diseo
itera6vo ya que permite acumular clculos parciales que representan el
estado del algoritmo en ese punto
A. Encadenamiento secuencial
Las instrucciones se encadenan secuencialmente
para que se ejecuten una detrs de otra
II. Sentencias de control de flujo
La ejecucin de instrucciones
puede ar6cularse en secuencia,
bifurca6vamente o en iteracin.
Existen sentencias que permiten
determinar el control de ujo

B. Control de flujo condicional


Las instrucciones se agrupan en dos bloques que
se ejecutan alterna6vamente si se sa6sface una
condicin
C. Control de flujo iterativo
Las instrucciones se agrupan en un bloque que se
ejecuta itera6vamente mientras se sa6sface una
condicin

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Diseo de algoritmos itera6vos

Diseo de algoritmos itera8vos


El diseo itera6vo u6liza instrucciones que prescriben cmo realizar los clculos o tareas
necesarias para llegar al resultado buscado. Estas instrucciones se ejecutan de acuerdo a
ujos de ejecucin, que pueden ser secuenciales, bifurca6vos e itera6vos. La u6lizacin de
variables y la sentencia de asignacin juegan un papel preponderante

Sentencia de asignacin
En el diseo itera6vo las variables representan almacenes de datos en memoria que
con6enen el valor resultante del cmputo de una expresin. Este valor representa
parcialmente el estado del algoritmo en 6empo de ejecucin en funcin de los
elementos de entrada
Estado

Cada sentencia
supone un cambio
potencial en el
estado de la
mquina. La
asignacin permite
recogerlo
parcialmente en el
valor de la variable

2 - 18

Sentencia;
variable = expresin;
Sentencia;
Expresin y variable

La variable es una referencia


simblica a un especio reservado
en memoria. La expresin una
frmula que permite calcular un
valor en funcin de otras variables
y constantes

Asignacin

A diferencia de cmo ocurre


en algoritmos recursivos las
sentencias de asignacin
permiten apoyarse en
variables para que sean
referidas posteriormente
desde otros puntos del
algoritmo

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Diseo de algoritmos itera6vos

Diseo de algoritmos itera8vos


El diseo itera6vo u6liza instrucciones que prescriben cmo realizar los clculos o tareas
necesarias para llegar al resultado buscado. Estas instrucciones se ejecutan de acuerdo a
ujos de ejecucin, que pueden ser secuenciales, bifurca6vos e itera6vos. La u6lizacin de
variables y la sentencia de asignacin juegan un papel preponderante

Encadenamiento secuencial
El modelo de ejecucin por defecto es la ejecucin secuencial. Segn ste, las
instrucciones son lanzadas a ejecucin de acuerdo al orden en que aparecen
correla6vamente escritas en el algoritmo
Encadenamiento secuencial

Sentencia;
Sentencia;
Sentencia;

El delimitador de sentencias separa una


sentencia de la siguiente dentro de un bloque
de instrucciones secuencial y puede ser
considerado como el operador que ar6cula el
encadenamiento secuencial

Ejecucin en secuencia

La ejecucin en secuencia se alinea con la idea de que


cada sentencia realiza un paso del algoritmo hacia la
obtencin del resultado nal y con la descomposicin
funcional descendente del paradigma estructurado
2 - 19

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Diseo de algoritmos itera6vos

Diseo de algoritmos itera8vos


El diseo itera6vo u6liza instrucciones que prescriben cmo realizar los clculos o tareas
necesarias para llegar al resultado buscado. Estas instrucciones se ejecutan de acuerdo a
ujos de ejecucin, que pueden ser secuenciales, bifurca6vos e itera6vos. La u6lizacin de
variables y la sentencia de asignacin juegan un papel preponderante

Control de ujo condicional


Las sentencias de control de ujo condicional alteran la ejecucin normal secuencial
de un algoritmo para generar dis6ntas bifurcaciones ejecutables en funcin de ciertas
condiciones ambientales
switch (expresin) {
if (expresin-lgica ) {

case cte-1: <<bloque-sentencias>> break;

<< bloque-sentencias>>

case cte-2: <<bloque-sentencias>> break;

} else {

...

<< bloque-sentencias>>

default: <<bloque-sentencias>>

If Then Else

Se evala la expresin lgica. Si el resultado es


cierto se ejecuta el primer bloque de sentencias.
Si es falso se ejecuta el segundo bloque de
sentencias
2 - 20

Switch - Case

Se evala la expresin. Si coincide con la


constante del caso i se ejecuta el bloque de
sentencias adjunto. Si no se ajusta a ningn caso
se ejecuta el bloque de sentencias default

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Diseo de algoritmos itera6vos

Diseo de algoritmos itera8vos


El diseo itera6vo u6liza instrucciones que prescriben cmo realizar los clculos o tareas
necesarias para llegar al resultado buscado. Estas instrucciones se ejecutan de acuerdo a
ujos de ejecucin, que pueden ser secuenciales, bifurca6vos e itera6vos. La u6lizacin de
variables y la sentencia de asignacin juegan un papel preponderante

Control de ujo itera8vo


Las sentencias de control de ujo itera6vo alteran la ejecucin normal secuencial de
un algoritmo para generar dis6ntas iteraciones sobre un cuerpo de sentencias. El
nmero de iteraciones depende de condiciones ambientales
for (asignacin-ndice;

<<inicializacin>>

<<inicializacin>>

expresin-lmite;

while (expresin-lgica ) {

do {

expresin-incremento) {

<< bloque-sentencias>>

<< bloque-sentencias>>

<< bloque-sentencias>>

<< incremento>>

<< incremento>>

} while (expresin-lgica );

For

While

Iteracin de bloque de sentencias


controlada por ndice. El valor
inicial se indica en asignacin-
ndice, el incremento en expresin-
incremento y termina cuando
expresin-lmite se hace falso
2 - 21

Iteracin de bloque se sentencias


mientras expresin-lgica sea
cierta. Inicializacin externa al
b u c l e . I n c r e m e n t o e x p l c i t o
\picamente al nal del bloque de
sentencias

Do - While

Iteracin de bloque de sentencias.


Inicializacin exterior. Incremento
\picamente al nal del bloque.
Comprobacin lgica al nal de
cada iteracin. Una ejecucin al
menos

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Diseo de algoritmos itera6vos

Diseo de algoritmos itera8vos


El diseo itera6vo u6liza instrucciones que prescriben cmo realizar los clculos o tareas
necesarias para llegar al resultado buscado. Estas instrucciones se ejecutan de acuerdo a
ujos de ejecucin, que pueden ser secuenciales, bifurca6vos e itera6vos. La u6lizacin de
variables y la sentencia de asignacin juegan un papel preponderante

Ejercicios
Encuentre una solucin itera6va para
cada uno de los problemas que se
presentaron con anterioridad
I.

Funcin factorial

public int sumaV (int[] v) {

II. Serie de fibonacci

int j = 0;

III. Potencia de un nmero

int s = 0;

IV. Suma de N naturales

while (j < v.length) {

V. Suma de un vector
VI. Producto escalar

2 - 22

// Pre: -1 < j <= length

s = s + v[j];
j++;
}

VII. Bsqueda en vector

return s;

VIII.Elementos repetidos

IX. Mximo comn divisor

// Post: s = v[i]

length
i=0

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Traduccin de algoritmos recursivos a itera6vos

Traduccin de algoritmos recursivos a


itera8vos

Los algoritmos
recursivos aunque elegantes y ecaces han presentado problemas histricos

de computabilidad ya que el soporte por parte de los compiladores a la invocacin recursiva


de programas es rela6vamente reciente. Merece la pena discu6r procedimientos de
transformacin de algoritmos recursivos a itera6vos

Traduccin de algoritmos con recursividad nal


public int sumaV (int[] v, int j, int w) {

public int sumaVit (int [n] v) {

if (j >= n) return w

int j = 0;

else return sumaV (v, j+1, v[j] + w)


}

int w = 0;

Los parmetros de entrada se subs6tuyen por


variables locales con el valor que recibiran en la
llamada inicial (j). El parmetro acumulador (w)
juega el papel del resultado parcial inicialmente 0.

while (j < n) {
w = w + v[j];
j = j + 1;
}

Dentro del bucle se calcula el valor,


en cada paso, de las variables de
resultado parcial w y de recorrido j

return w;
}

2 - 23

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Traduccin de algoritmos recursivos a itera6vos

Traduccin de algoritmos recursivos a


itera8vos

Los algoritmos
recursivos aunque elegantes y ecaces han presentado problemas histricos

de computabilidad ya que el soporte por parte de los compiladores a la invocacin recursiva


de programas es rela6vamente reciente. Merece la pena discu6r procedimientos de
transformacin de algoritmos recursivos a itera6vos

Traduccin de algoritmos con recursividad no nal


public int factorial( int n ) {
if (n == 0) return 1;
else return n * factorial ( n - 1 );
}

public int factIt (int n) {


int i = n;
while (i > 0) {
i = i - 1
}
int r = 1;
while (i < n) {
r = r * i;
i++;
}
return r
}

2 - 24

Buscar en i el nal de la cadena de llamadas


descendente. Se aplica en cada vuelta el sucesor
de los parmetros (n-1) hasta encontrar el
equivalente al tamao del caso trivial (0).
Se usa r para acumular el resultado. Se inicializa
al resultado del caso base. Se usa la variable i
como objeto de comparacin del segundo
bucle. Se computa el resultado parcial aplicando
la funcin de combinacin (*) por el valor del
parmetro. Al nal se devuelve el resultado

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Traduccin de algoritmos recursivos a itera6vos

Traduccin de algoritmos recursivos a


itera8vos

Los algoritmos
recursivos aunque elegantes y ecaces han presentado problemas histricos

de computabilidad ya que el soporte por parte de los compiladores a la invocacin recursiva


de programas es rela6vamente reciente. Merece la pena discu6r procedimientos de
transformacin de algoritmos recursivos a itera6vos

Traduccin de algoritmos mediante el uso de una pila


int invertir (int n, int r) {

int invertirIt (int n) {

if (n == 0) return r;

int j = n;

return invertir ((n / 10), r * 10 + n % 10); Stack <int> p=new Stack <int>();
}

Inicializacin de j como
variable local que
representa el valor inicial
del parmetro y de p como
pila vaca de trabajo

while (j > 10) {


p.push (j);
n = n / 10;

Apilamos el valor en curso de j para


recuperarlo a la vuelta y calculamos el
sucesos (n/10)

}
int k = j;

Hemos terminado la cadena descendente de


llamadas. Ahora preparamos la cadena
ascendente de vuelta. k llevar el resultado,
que parte del valor de j cuando termina el
bucle de ida

while (!p.isEmpty ()) {


j = p.top();
p.pop();
k = k + (j % 10);
}
return k }

2 - 25

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Catlogo de algoritmos

Catlogo de algoritmos
Aunque encontrar un catlogo de algoritmos cannicos y recurrentes es complejo dado su
gran diversidad, si relacionamos el diseo de algoritmos con los principales 6pos abstractos
de datos que se presentaron en el tema anterior, es posible encontrar 3 categoras
generales en la que stos caen principalmente de acuerdo a su propsito
I. Algoritmos de recorrido
El propsito de los algoritmos de recorrido es encontrar una expresin lineal de
los elementos almacenados en la estructura de datos. Dependiendo de sta
puede haber varias estrategias de recorrido alterna6vas. El resultado es una
coleccin ordenada de los elementos de la estructura
Catlogo de
algoritmos

2 - 26

II. Algoritmos de bsqueda


El propsito de los algoritmos de bsqueda es encontrar una elemento de entre
todos los elementos almacenados en la estructura de datos. Dependiendo de
sta existen dis6ntas estrategias con complejidad viceversa. El resultado es un
valor de verdad indicado si se encuentra el elemento o un ndice de posicin
III. Algoritmos de ordenacin
El propsito de los algoritmos de ordenacin es reorganizar los elementos de la
estructura de datos para disponerlos de acuerdo a cierto criterio de orden.
Para poder ar6cular una ordenacin sobre una estructura de datos los
elementos deben ser comparables y la estructura prestarse al criterio de orden

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Catlogo de algoritmos

Catlogo de algoritmos
La naturaleza itera6va o recursiva de los algoritmos quede frecuentemente inducida por la
forma en que el perl de las operaciones da acceso a los datos. A lo largo de este curso
repasaremos los principales 6pos de algoritmos recorrido, bsqueda y ordenacin
aplicables sobre cada uno de los 6pos abstractos de datos que estudiaremos
Recorrido

Bsqueda

Ordenacin

Listas*

Recorrido directo
Recorrido inverso


Bsqueda secuencial

Insercin
Merge sort

Pilas


Recorrido desde la cima


Bsqueda secuencial

Colas


Recorrido hacia el nal


Bsqueda secuencial

Arboles

Preorden, inorden,
postorden
Recorrido en anchura


Bsqueda binaria


Ordenacin

* Se reere a listas, listas doblemente


enlazadas y listas circulares

2 - 27

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Bibliograha

BibliograOa
Bibliografa bsica
Estructuras de datos en java. Weiss, Mark
Allen. Pearson Addison Wesley. ISBN
9788478290352

2 - 28

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es

Estrategias de programacin
Bibliograha

BibliograOa
Bibliografa complementaria
Programacin metdica. BALCZAR, J. L.
McGraw-Hill, 1993. ISBN 8448119576

2 - 29

Diseo de programas. Formalismo y


abstraccin. Ricardo Pea Mar. Pearson Prentice Hall. ISBN 13: 9788420541914

Javier Vlez Reyes jvelez@lsi.uned.es Jos Ignacio Mayorga Toledano nmayorga@lsi.uned .es