Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Aquí vamos a abocarnos a los algoritmos puros. Si bien, tenemos que tener en
cuenta las estructuras de datos con lo que trabajarán los algoritmos. No lo
relacionados con ningún lenguaje en particular, eliminando detalles propios de
implementadción de un determinado lenguaje de programación.
Aquí hay una instrucción (no una ecuación X 2 = A, sino no hace falta el algoritmo)
“Para obtener el nuevo valor de X ponga el promedio entre el viejo valor de X y el
cociente de A y el viejo valor de X”.
Página1
Esto es una de las características de la notación algorítmica, lo que parece una
ecuación no lo es, sino una instrucción.
Página2
Raiz2(a) = iter(a,3)
donde
iter (a,x)=
sea c = cociente(a,x)
si (x=c ó x+1=c) x
sino
si (c+1=x) c
sino iter(a, cociente (x+cociente(a,x),2))
Note que cada invocación de iter es automática, funciona con ignorancia total del
contexto con que fue invocado.
La función cociente nos devuelve la parte entera de a / b, o sea un natural x tal que
x b <= a < (x+1) b (iter es local, cociente y raiz2 global)
Página3
Programación Funcional
Si lo que hace un programa es realizar una función , lo primero que tiene que
entender el programador es saber ¿Cuál es la función?. Independientemente de
como van a ser los mecanismos para invocar la función y a las subfunciones que
de ella dependen.
Entender una función y saber calcularla para cualquier argumento son dos cosas
muy distintas.
En un extremo tenemos funciones difíciles de calcular y fáciles de definir y en el otro
extremo están las funciones fáciles de calcular y difíciles de definir.
Trabajaremos con funciones que no son muy difíciles de definir y no son triviales
para calcularlas. La mayoría se definen con notación matemática estandard
aumentada con unos cuantos artificios especiales para expresar algoritmos.
Note que en cada iteración de la “para” estamos evaluando una función de tres
argumentos a,b,y p. Esta función, cada vez que inicia una nueva iteración, se
Página4
está llamando a sí misma. Si llamamos a esta función mcd1 se la puede definir
así:
mcd1(a,b,p)=
si (p=1) 1
sino
si (resto(a,p) = resto(b,p)=0) p
sino mcd1(a,b,p-1)
Si p=1 el mcd vale 1 sino evaluamos los dos restos de a y b dividido p. Si son = 0 la
función vale p, sino vale lo que que da ella misma aplicada en los argumentos a,
b, p-1.
Ejemplo: mcd(16,12)
Algoritmo iterativo: Para p=12 ..........(-1)..............2
resto (a,p)=0 & resto(b,p)=0 luego p
luego 1
p a b resto(a,p) resto(b,p)
12 16 12 ≠0 =0
11 ≠0 ≠0
10 ≠0 ≠0
9 ≠0 ≠0
8 =0 ≠0
7 ≠0 ≠0
6 ≠0 =0
5 ≠0 ≠0
4 =0 =0 luego 4
O sea:
f (x1, x2, …, xn) = si C luego E1 sino E2
En este esquema no hay ninguna garantía que convocando una de las funciones
vamos a conseguir un valor.
Ya que está dirigido al ser humano (no a una máquina), el único requerimiento
sintáctico es la claridad matemática. De hecho, es notación matemática estándar,
con unos pocos agregados que facilitan la expresión de algoritmos.
SINTAXIS
Mientras ( b0)
temp = b
Euclides (en forma imperativa) b=resto(a,b)
a= temp
Aquí nos preocupamos por el manejo de memoria “En la forma funcional se puede
dejar de lado todo detalle del manejo de la memoria”
La cuestión de cómo se va a manejar la memoria, y manejarla eficientemente,
pertenece al área de estructura de datos, que no estamos considerando en este
momento.
La forma imperativa que hemos visto es más eficiente y rápida de ejecutar en la
máquina.
Página7
TIPOS DE DATOS
Los números naturales forman un tipo de datos y vienen con ciertas operaciones,
básicamente sumar y multiplicar. La sustracción y división no siempre son
posibles. Con esto queremos decir que un tipo de datos es un conjunto con unas
funciones asociadas. A veces hay que especificar el tipo de datos.
COCIENTE:
cociente(a, b) = si ( a<b) 0 sino cociente(a-b, b)+1
cociente es el número de veces que podemos restar b de a.
RESTO:
resto(a, b) = si(a<b) a sino resto(a-b, b)
resto es lo que queda después de restar b todas las veces
posibles
.
Si deseamos los dos resultados (dos números enteros: cociente y resto) tenemos:
OTRO TIPO DE DATOS: ”El par ordenado” de números naturales.
El conjunto de este tipo de datos es NxN y las funciones son primero y segundo. Si
z es un par ordenado de datos, entonces primero(z) y segundo(z) son números
naturales.
Veamos la función Cociente – Resto que contesta un par ordenado z
“1+1”
retorna
cociente (17, 7)
invoca
Página8
Ejemplo: resto(a, b) = si(a<b) a sino resto(a-b, b)
resto(31, 7) S/R
invoca
resto(24, 7) S/R
invoca
resto(17, 7) S/R
invoca
resto(10, 7) continua desde donde fue llamado (fin) S/R (sin retorno)
invoca
resto(3, 7) como (a<b) retorna “3” (resultado final)
El que lleva a cabo fielmente los ejercicios de div10 encuentra que si no tiene
cuidado puede perderse.
Otro ejemplo complicado es el de dados dos números a y b distintos de cero,
encontrar dos números enteros s y t tales que sa+tb=mcd(a,b).
Por ejemplo para a=6 y b=4 una solución es s=1 y t=-1 o s=3 y t=-4
Pues 1*6+(-1)*4=mcd(6,4) Rta 2.
st(a,b) = si (b=0) luego (1,0)
Sino sea (c,r) = cr(a, b)
(s,t) = st((b, r)
(t, s-ct).
Aparear (“a(a)”)
1
aparear(“(a)”)
aparear(“a)”) s1 = ”(” t = “)”
2
1
aparear (“)”)
aparear (nulo)
fin (ok)
•Las funciones primitivas que actúan sobre este tipo de datos son:
Primero(): retorna el primero de la lista, sin sacarlo de ella.
Resto(): retorna una lista con los mismos elementos que la lista
pasada por parámetro, pero sin el primero de ella.
•Vacío es una constante asociada a este tipo de datos que tendrá una lista
vacía.
Volviendo al problema propuesto, para conocer el mayor de una lista se debe
recorrer secuencialmente y por completo la lista.
Cuando se inspeccionó un elemento de la lista, el primero, falta inspeccionar
Página10
el resto de la lista, a menos que sea el último, es decir, que el resto de la
lista sea una lista vacía.
Sobre una lista vacía, sería un error buscar el mayor elemento.
Sobre una lista de un solo elemento, el mayor es justamente ese, que está
ubicado como primero.
• Si la Lista = [5]
Por línea 2 la función tomará el valor de Primero([5]), el valor 5.
• Si la lista = [ ]
Por la línea 1 la función tomará el valor de ERROR.
Pruebas:
• Si la lista = [9, 6]
• Si la lista = [2, 6]
Otro ejemplo:
Sumar los elementos de una lista de enteros.
Página11
La función suma se la puede expresar como:
Página12