Fundamentos: Algoritmos

Según el diccionario, un algoritmo es un conjunto ordenado de operaciones sistemáticas que permite hacer un cálculo y hallar la solución de un tipo de problemas. Por ejemplo, cualquiera de los métodos que aprendimos en la escuela para multiplicar dos números reales es un algoritmo. El método o la receta para preparar una comida no es un algoritmo, ya que el orden de algunos pasos, muchas veces, no importa o ni siquiera está claramente especificado (por ejemplo, podemos batir las claras a nieve antes o después de mezclar la harina con él azúcar, y aún así vamos a poder hacer una torta).

Ahora que conocemos los algoritmos, podemos redefinir el término programa como implementación de un algoritmo determinado en un lenguaje de programación. El conocimiento del concepto de algoritmo es fundamental para todo programador ya que, en la tarea diaria de escribir programas para resolver problemas, antes debemos descubrir y entender cuál es el algoritmo que los resuelve. Muchas veces, como programadores, nos encontraremos siguiendo los pasos de un algoritmo con lápiz y papel para entender su funcionamiento o probar su eficacia.

LIBROS ÚTILES

Hay una gran cantidad de libros para introducirse en el mundo de la programación de software y de los algoritmos. Recomendamos, Metodología de la Programación. Algoritmos, diagramas de flujo y programas, de Osvaldo Cairo. En el cual, se proponen distintas técnicas de análisis para enfrentar la solución de un problema y llevarla a un algoritmo.

EXPRESIÓN DE ALGORITMOS

Como los algoritmos no están relacionados únicamente con la programación de computadoras, es necesario contar con métodos independientes para expresarlos y, por lo tanto, transmitirlos a otras personas. En la actualidad, existen varias formas de expresar un algoritmo, como ser, el lenguaje natural, el pseudocódigo, los diagramas de flujo, algunos diagramas del lenguaje de modelado UML (que veremos en el último capítulo de este curso), etcétera.

En el caso del lenguaje natural, el algoritmo es expresado por medio de oraciones en un idioma determinado. A modo de ejemplo, se puede indicar el algoritmo, en lenguaje natural, para ver una película en DVD de la siguiente manera: presione la tecla Open/Close para abrir la bandeja del reproductor; luego, inserte el disco y presione la tecla nuevamente. En su televisor, seleccione la opción DVD y por último presione la tecla Play.

CARACTERÍSTICAS DE LOS ALGORITMOS

El estadounidense Donald Knuth, autor del libro El arte de programar computadoras, señaló cinco propiedades que deberá tener todo algoritmo:

> Finito:  un algoritmo debe tener un número finito de pasos, tras los cuales debe terminar.

> Preciso:  cada paso debe estar definido con precisión, rigurosidad y sin ambigüedades.

> Entradas:  todo algoritmo debe tener cero o más entradas, que son los datos que se le proporcionan como información variable y específica de la instancia del problema que resuelve.

> Salida:  un algoritmo tiene una o más salidas, que son el resultado del problema que intenta resolver, y que dependen de las entradas provistas.

> Eficacia:  los pasos deben ser suficientes para lograr el cometido del algoritmo, es decir, el algoritmo debe ser eficaz.

Pseudocódigo

Uno de los problemas del lenguaje natural es que suele resultar excesivamente verborrágico, ya que debe respetar en cierta medida las reglas gramaticales del lenguaje. Para evitar este problema, se puede utilizar un pseudocódigo, que consiste en una serie de normas sintácticas y gramaticales, parecidas a las de un lenguaje de programación, pero sin tanta rigidez, y con cierta libertad en el uso y en la combinación de las palabras.

Por ejemplo, supongamos que debemos escribir el algoritmo de Euclides para encontrar el máximo común divisor entre dos números enteros. Usando pseudocódigo, podemos consignar:

Entrada: A, B enteros
Salida: el máximo divisor común entre A y B

Mientras A > 0 hacer:
      Si A > B
         A := A – B
      Si no
         B := B – A
El Máximo Común Divisor es el contenido de A

Esto significa que la entrada al programa consiste de números enteros (A y B) y, mientras el valor de A sea mayor que cero, se le asigna a A la resta entre A y B, si A es mayor que B; si no, a B se la asigna la diferencia entre B y A. El resultado es el valor que queda en A luego de las sucesivas restas.

Como puede verse en el ejemplo, se especifican claramente cuáles son los datos de entrada y de salida. Además se utilizan algunos símbolos ya conocidos (como el signo mayor a) y otros propios del pseudocódigo (como el signo := para representar que el elemento de la izquierda toma como valor el resultado de la operación de la derecha).

Diagrama de flujo

Los diagramas de flujo son una representación gráfica de los pasos de un algoritmo. En un diagrama de flujo, cada tipo de figura tiene su significado. Su nombre se debe a que las figuras se conectan con flechas que indican la secuencia o flujo de operación.


Si bien muchas personas utilizan sus propios símbolos y figuras al momento de crear sus diagramas de flujo, actualmente está definido de manera clara y estándar cuáles son las figuras válidas y cuál es su significado, de manera que cualquiera que las conozca pueda interpretar el diagrama.

Los símbolos más utilizados son:

> Flecha: indica el sentido del proceso, es decir, hacia dónde hay que dirigirse para encontrar el siguiente paso.
> Rectángulo: se usa para representar un paso determinado del algoritmo.
> Rombo: representa un punto de decisión sobre la base de una condición. De un rombo salen siempre dos flechas: una en un sentido, si se cumple la condición y otra en otro sentido, si la condición no se cumple.

PARA TENER EN CUENTA

Al hacer un diagrama de flujo, hay que tener muy presente estos aspectos:

- Debe haber un único punto de inicio del proceso.
- Debe haber siempre un camino para llegar a la solución.
- Debe haber un único punto de fin del proceso.

Para ilustrar el concepto, vamos a especificar el algoritmo de Euclides que usamos anteriormente, mediante un diagrama de flujo.

Diagrama de flujo del algoritmo de Euclides

CONCLUSIONES

Para introducirse en el mundo de la programación y el desarrollo de aplicaciones de software, es muy importante comenzar con una buena base de conocimiento de algoritmos y técnicas de resolución de problemas de distinto tipo, sin usar un lenguaje específico (podemos usar pseudocódigo). Una vez que dominemos ciertas técnicas de resolución de problemas y podamos expresar las soluciones como algoritmos, estaremos preparados para aprender lenguajes de programación que nos permitan llevar esos algoritmos a una computadora que los ejecute por nosotros.