Documente Academic
Documente Profesional
Documente Cultură
Diana Cicinelli
Introducción al Diseño
de Algoritmos
Introducción
Los algoritmos son métodos bien definidos con el único fin de realizar una tarea específica.
Generalmente, los algoritmos son expresados en lenguaje natural (Español, inglés, etc.) y
luego son traducidos a un lenguaje formal (Lenguaje C, Python, Java, etc. ). Cuando se
debe desarrollar un programa para resolver un determinado problema, el paso primero es
"pensar una solución", en nuestra mente debe aparecer la idea para resolver el problema
planteado que luego volcaremos en lápiz y papel a una secuencia de pasos a seguir que
escribiremos en lenguaje natural que llamaremos algoritmo. El algoritmo así obtenido
puede ser traducido a un lenguaje de programación, por lo tanto, el algoritmo es
independiente del lenguaje formal.
Definición
Un algoritmo es un conjunto ordenado de pasos ejecutables que define, sin ambigüedad,
cómo debe llevarse a cabo una tarea.
Ejemplo de algoritmos:
• dividir un número A por otro B si B es distinto de cero.
• multiplicar un número A por otro B.
• calcular la raiz cuadrada de un número.
• conversión de una representación numérica a otra.
• detección y corrección de errores en datos.
• compresión y descompresión de archivos.
• control de multiprogramación en un entorno multitarea.
Análisis del algoritmo: en este sencillo ejemplo podemos ver que las únicas dos tareas que
se llevan a cabo están ordenadas de manera secuencial, una a continuación de la otra y
1
Programación I – 2016 Prof. Diana Cicinelli
este orden no se puede invertir porque primero debemos "leer" el dato a procesar que es la
temperatura medida en grados Celsius.
En este caso se observa que el paso 1 de la primera versión fue subdividido en dos tareas
más sencillas. El proceso llevado a cabo se denomina diseño "Top-Down". Se desarrolla el
problema en etapas que a su vez van a ser subdivididas en tareas elementales.
Algoritmos Cotidianos:
Los algoritmos están presentes también en la vida diaria como podemos ver en el
siguiente ejemplo:
Enunciado: Preparar una taza de Té teniendo una pava, una tetera, una taza, un saquito
de té y azucarera.
Algoritmo:
llenar de agua la pava
encender el fuego
poner la pava en el fuego
esperar a que hierva el agua
colocar la bolsa de té en la tetera
poner el agua hervida en la tetera
esperar un minuto
hechar el té en la taza
endulzar
Enunciado: Teniendo una cantidad infinitas de papas y una cesta, pelar una cantidad
suficientes de papas.
Algoritmo:
mientras no tenga una cantidad suficiente de papas peladas:
si el cesto está vacío:
llenar el cesto
pelar una papa
Análisis del algoritmo: en esta sencilla solución al problema podemos ver que nuestro
procesador sabe pelar una papa, verificar el estado de la cesta y si se llegó a la cantidad
2
Programación I – 2016 Prof. Diana Cicinelli
suficiente de papas peladas. Además podemos observar que hay un orden en la forma de
ejecutar los pasos, ya que la instrucción "pelar una papa" no se podría realizar si la cesta
está vacía, por este motivo es que primero se debe llenar la cesta.
Podemos ver, también, que en el proceso de obtener una suficiente cantidad de papas
peladas no alcanza con pelar una papa, se deben pelar, tal vez, más de una y por lo tanto
aparece aquí la necesidad de repetir una misma tarea varias veces. Este mecanismo de
repetición se logra utilizando la instrucción "mientras". ¿Cuántas veces debemos repetir
los mismos pasos? Para controlar que pelemos exactamente una cantidad suficiente de
papas peladas, ni una más, ni una menos, debemos verificar la cantidad de papas peladas
tantas veces como sea necesario. Llegamos a un punto donde debemos distinguir entre
una acción a llevar a cabo y una pregunta que hacemos para saber si hemos obtenido
nuestro propósito. La acción que se debe hacer o ejecutar se denomina "instrucción" y se
puede describir como la orden a llevar a cabo y aquello que se pregunta para parar el
proceso se denomina "proposición" o también "condición". El valor asignado a una
condición depende de su verdad o falsedad mientras que la instrucción u orden sólo se
realiza, se ejecuta.
El algoritmo debe ser expresado en acciones primitivas para poder ser traducido a
programa. Muchas veces las acciones primitivas están determinadas por el lenguaje de
programación que se usará. Existen muchos lenguajes formales, algunos son aplicables a
determinadas tareas para las cuales son más eficientes pero la mayoría de los lenguajes
están diseñados para propósitos múltiples.
Una vez que se obtiene el algoritmo debe ser traducido a un lenguaje de Programación.
Los lenguajes formales de programación están basados en un conjunto de acciones
primitivas que tienen una determinada sintaxis y una determinada semántica. La sintaxis
se refiere a la forma simbólica de representación de la instrucción (cómo se escribe) y la
3
Programación I – 2016 Prof. Diana Cicinelli
Estructuras de Control
En los ejemplos anteriores encontramos que hay procesos en los cuales el orden de las
acciones se realiza en secuencia, una después de la otra, este esquema se denomina
secuencia. Mientras que otros procesos se deben repetir una cantidad de veces hasta que
se obtiene el objetivo. Este proceso repetitivo se describe con la palabra "mientras"
acompañada de una condición que según su valor de verdad o falsedad determina
cuándo se finaliza la repetición del mismo proceso.
4
Programación I – 2016 Prof. Diana Cicinelli
Enunciado: Cáculo del valor de la función f(x) = 0 si x <= 0, f(x) = x^2 si x > 0.
Algoritmo:
obtener el valor de x
poner f en 0
si x > 0
poner x^2 en f
mostrar el valor de f
Diseño de Algoritmos:
El desarrollo de un programa consiste de tres etapas:
• entender el problema
• diseñar el algoritmo que resuelva el problema
• traducir el algoritmo a programa
De las dos etapas enunciadas la más difícil es la segunda. Poder diseñar un algoritmo que
resuelva determinado problema involucra encontrar un método y probar que este método
resuelve el problema eficientemente.
Ejemplo:
Enunciado: Calcular la superficie de un círculo
Después de entender el enunciado, lo primero que debemos pensar es qué necesitamos
para llegar a una solución, en este ejmplo necesitamos conocer el radio del círculo, es
decir, que el radio es un dato para el algoritmo y debemos tenerlo antes de aplicar el
método que lo resuelve.
Algoritmo:
Etapa 1: 1) Entrada de datos
2) Cálculo de la superficie
3) Mostrar el resultado
Las acciones que quedaron especificadas son acciones primitivas que no se pueden seguir
descomponiendo, por lo tanto, lo que quedó es el algoritmo que resuelve el problema.
Ejemplo:
Enunciado: Encontrar el máximo común divisor entre dos números enteros y positivos.
5
Programación I – 2016 Prof. Diana Cicinelli
Etapa 1)
Todos sabemos, por lo que hemos aprendido en la escuela secundaria, que el máximo
común divisor entre dos números se obtiene de multiplicar los factores primos comunes a
los dos números.
Algunos ejemplos:
mcd(180,60) = 60
mcd(17,3) = 1
mcd(12,18) = 6
Etapa 2)
Algoritmo 1)
obtener el número A y el número B
calcular los factores primos del número A
calcular los factores primos del número B
obtener y multiplicar los números comunes de ambos procesos
mostrar resuyltado del producto
Algoritmo 2)
obtener el número A y el número B
mientras A y B sean distintos de cero:
si A es mayor que B:
dividir A por B y dejar el resultado en A
sino
dividir B por A y dejar el resultado en B
mostrar el último valor de A que es el máximo común divisor
Como se puede apreciar hay dos algoritmos distintos para llegar al mismo resultado.
¿Cuál es el mejor? Para determinar cuál elegir de entre todos los algoritmos posibles para
resolver un mismo problema se pueden usar distintos criterios, uno de ellos podría ser la
cantidad de instrucciones primitivas que se ejecutan. En general se tienen en cuenta
cuántas veces se repite el conjunto de instrucciones dentro de una estructura de repetición.
En este ejemplo, con dos posibles soluciones, encontramos que en la primera solución
tenemos tres tareas que involucran cada una de ellas un ciclo, esto es obvio porque cada
número debe descomposnerse en factores y primos y cada número puede tener uno ó más
factores primos; para calcular todos los factores primos debe hacerse con un ciclo.
Mientras que en la segunda solución sólo hay un ciclo, ya con esto podemos tomar elegir
el segundo algoritmo como el más óptimo.
Ejercicio:
a) Realizar un algoritmo que dado un número entero positivo n, calcular la lista de
números positivos cuyo producto es el mayor entre todas las listas de números cuya suma
es n. Ejemplo: si n es 4, las listas posibles de números enteros que sumen 4 son:
2, 2 cuyo producto es 4
1, 1, 1, 1 cuyo producto es 1
2, 1, 1 cuyo producto es 2
6
Programación I – 2016 Prof. Diana Cicinelli
3, 1 cuyo producto es 3
mientras (condición):
cuerpo del ciclo
verifica condición
ejecuta el cuerpo
verifica condición
ejecuta el cuerpo
.
.
.
verifica condición
numero condición
1 1 ≠ 8 verdad
3 3 ≠ 8 verdad
5 5 ≠ 8 verdad
7 7 ≠ 8 verdad
9 9 ≠ 8 verdad
y así sigue, no finalizando.
7
Programación I – 2016 Prof. Diana Cicinelli
Esto sucede porque la condición fue mal elegida, la condición correcta debería haber sido
"numero <= 8", de esta forma hubiese finalizado correctamente.
En definitiva, en el ejemplo anterior, numero debe incrementarse hasta llegar a 7. Pero esta
no es la única forma de construir una condición para un ciclo repetitivo.
La forma de elegir la condición dependerá del problema planteado pero siempre teniendo
presente que la condición tendrá que ser capaz de cambiar de estado para poder
interrumpir el ciclo. Enn este punto hay que hacer notar que la condición puede llegar a
ser compleja involucrando más de una proposición en la misma condición.
Ejercicios:
1) Diseñar un algoritmo que permita encontrar todos los factores de un número entero
positivo. Por ejemplo, para el número 12, el algoritmo debería calcular 1, 2, 3, 4, 6 y
12.
2) Diseñar un algoritmo para determinar el día de la semana de cualquier fecha desde
el 1 de Enero de 1700. El 17 de Agosto de 2001 fue viernes.
3) Diseñar un algoritmo que encuentre la palabra más larga de un texto dado. Si hay
más de una con la misma longitud.
4) Dada la siguiente lista de números: 26, 39, 104, 195, 403, 504, 793, 995, 1156, 1677.
Realizar un algoritmo que permita extraer un subconjunto de números cuya suma
sea 3165.
5) El siguiente fragmento de algoritmo es correcto? Finaliza?
X←1
Y←½
mientras (X ≠ 0):
X← X–Y
Y← Y / 2
♫♪♫