You are on page 1of 8

Funciones

Minaya Villasana Abril-Julio, 2004

Funciones y su importancia

Una buena pr actica en programaci on es tratar en lo posible de hacer programas modulares, con esto nos referimos a un c odigo particionado en bloques o secciones con una funcionalidad muy espec ca. Considere el siguiente ejemplo: Ejemplo 1.1. # Ejemplo 1 ni = input("\n Introduzca el n umero de iteraciones: "); if floor(ni)~=ni, disp("Error: El n umero no es entero"); endif nv = input("\n Introduzca el n umero de variables: "); if floor(nv)~=nv, disp("Error: El n umero no es entero"); endif ne = input("\n Introduzca un n umero entero: "); if floor(ne)~=ne, disp("Error: El n umero no es entero"); endif En el ejemplo 1.1 vemos una porci on de c odigo que se repite exactamente tres veces. Un c odigo mucho m as limpio seria como en el ejemplo 1.2 donde se ha reemplazado la porci on del c odigo que valida si una entrada es entera o no. Ejemplo 1.2. 1

# Ejemplo 1 ni = input("\n Introduzca el n umero de iteraciones: "); validar(ni) nv = input("\n Introduzca el n umero de variables: "); validar(nv) ne = input("\n Introduzca un n umero entero: "); validar(ne) Utilizar funciones tiene muchas ventajas: on 1. Solamente se escribe una vez. En el ejemplo anterior, nos ahorramos tener que escribir la misma porci del c odigo una y otra vez. Esto evita errores involuntarios (pero siempre presentes) de transcripci on. 2. Si una funci on es probada y funciona bien, funcionar a bien cada vez que se use (siempre y cuando el uso sea el correcto). Esta es una ventaja importante cuando estamos buscando errores presentes en nuestros programas, puesto que evaluamos pedazos cada vez mas peque nos lo que facilita la detecci on de errores. 3. Son portables. Una misma funci on puede ser u til para distintos casos, distintos programas y distintos programadores. 4. C odigo m as limpio. Al usar funciones reducimos las l neas de c odigo de nuestro programa y por lo tanto se hacen mucho m as f aciles de leer y validar su correctitud. 5. Parte un programa en varios subprogramas.

Estructura de una funci on

En Octave/Matlab una funci on se puede construir en un archivo separado del programa principal. La declaraci on es la siguiente:

FUNCTION [Parametro_Salida]= NOMBRE_FUNCION (Parametros_Entrada) # comentarios para la ayuda.

# Aqu pueden ir algunos comandos

Parametro_Salida = valor final; endfunction Algunas observaciones son pertinentes: 1. La palabra FUNCTION es una palabra reservada que puede estar en min usculas o may usculas sostenidas. 2. Una funci on puede tener una entrada (como en el ejemplo 1.2), m ultiples entradas o ninguna entrada. 3. Una funci on puede una funci on puede tener una variable de salida, m ultiples variables de salidas o ninguna variable de salida (como en el ejemplo 1.2, aunque aqu la salida era un mensaje de error no fue asignada a ninguna variable al nal). on de la funci on el nombre de la funci on es el nombre con el cual identicamos a la 4. En la declaraci funci on, la funci on se salva en un archivo con ese mismo nombre y con extensi on .m 5. Las entradas y salidas pueden corresponder a distintos tipos de datos, n umeros, vectores, matrices, cadena de caracteres y en general cualquier estructura disponible en Matlab/Octave. 6. Los comentarios justo despu es de la declaraci on son las l neas que se leer an cuando el usuario pida ayuda de la funci on. 7. En Matlab el endfunction se omite y para algunas versiones de Octave tampoco es necesario. Ejemplo 2.1. Suponga la siguiente function declarada en Octave/Matlab. function [Area,Distancia] = CalcArea (x,y) # Esta funci on calcula el area del tri angulo formado por los puntos # (0,0), (x,0) y (x,y). # al origen. Retorna adem as la distancia del punto (x,y)

Area = abs(y)*abs(x)/2; Distancia = sqrt(x^2 + y^2); 3

endfunction En el ambiente de Octave podemos invocar [Ar,dist]= CalcArea(1,-1) y esto me retornar a en las variables Ar y dist los valores correspondientes a 1/2 y 2 respectivamente.

Del ejemplo anterior podemos decir algunas cosas. En primer lugar notamos que en la funci on hicimos uso de otras funciones que son propias del lenguaje, nada nos impide hace uso de funciones declaradas por el usuario en nuevas funciones declaradas. En segundo lugar, noten que al hacer uso de la funci on utilizamos nombres distintos para las variables de salida a aquellos utilizados en su declaraci on original.

Alcance de una variable

El alcance de una variable es donde ha sido denida una variable. Las variables que fueron declaradas dentro de una funci on viven solamente en esa funci on, en otras palabras estas no existen fuera de ese ambito. Al invocar una funci on el lenguaje crea las variables internas (distintas a las externas) que son eliminadas al nalizar la ejecuci on de la funci on. Supongamos el siguiente ejemplo: Ejemplo 3.1. Sea la siguiente funci on en Octave: function y = f(x) a=5 y=x+1 endfunction En el ejemplo 3.1 las variables a, x e y existen dentro de la funci on. Si en el ambiente de Octave hacemos los siguientes comandos: a=20; y=f(a). Qu e valor tiene a? Qu e valor tiene y? Qu e valor tiene x? En el ambiente de Matlab a vale 20 aunque una variable llamada a en la funci on f tuvo valor de 5. El valor de y ser a el valor retornado por la funci on que en este caso es 21 y la variable x no existe en el espacio de trabajo, puesto que esta era una variable local a la funci on f. En este ejemplo debe quedar claro el alcance de las variables. No debe crear confusi on el hecho de que se utilice un mismo nombre para una variable dentro y fuera de una funci on. Las variables declaradas en una

funci on son locales para esa funci on y solo existe durante la ejecuci on de la misma. As mismo una variable declarada fuera de una funci on no se conoce dentro de la misma. Es una buena pr actica de programaci on utilizar funciones siempre que se pueda y limitar el uso de variables globales. Las variables globales son aquellas variables que traspasan las barreras de la funciones y son conocidas dentro y fuera de las funciones. Para hacer una variable global, simplemente se hace la declaraci on en el programa principal con el comando global y enumerando las variables que gocen de esta propiedad.

4
4.1

Comandos especiales
return

Una vez llegado al u ltimo comando de una funci on esta naliza retornando un valor (si lo hubiese), sin embargo se puede terminar la ejecuci on de una funci on utilizando el comando return, como en el ejemplo 4.1: Ejemplo 4.1. function salida = funcionprueba(entrada) if entrada==1, fprintf("\n Entrada equivocada!") salida=0; return; endif salida = entrada*5; endfunction al hacer el llamado y=funcionprueba(2), la variable y adquiere el valor de 10 (en la funci on el condicional es falso y contin ua evaluando las otras operaciones). Pero si la llamada es y=funcionprueba(1), el valor de y es 0, puesto que al evaluar verdadero el condicional asigna 0 a la variable de salida e inmediatamente termina la ejecuci on de la funci on, luego cualquier otro comando despu es del retorno no es ejecutado. Es importante al hacer uso de este comando que previo a nalizar la ejecuci on hagamos la asignaci on a las variables de salida correspondientes.

4.2

nargin y nargout

Las variables nargin y nargout cuentan el n umero de variables que entran a una funci on y el n umero de salidas que produce una funci on. A simple vista estas variables pueden parecer poco u tiles, pero cuando estudiamos algunos ejemplos y casos comprendemos su utilidad. Si buscamos la ayuda de la funci on que calcula el m nimo min en Octave/Matlab veremos que la funci on puede ser utilizada de muchas maneras: m=min(A): retorna en la variable m el valor m nimo de A. [m,ind]=min(A): retorna adem as en ind, el ndice donde se localiza el m nimo de A. m=min(A,dim): retorna el m nimo de A en la dimensi on dada por dim (si dim=1, es por las, si dim=2, por columnas, etc.). [m,ind]=min(A,dim): ya podemos imaginarnos lo que hace, cierto? Ahora la pregunta es, c omo hace Octave/Matlab para saber qu e cosa debe retornar, o a lo largo de cual dimensi on calcular el m nimo? La clave est a en contar el n umero de entradas y salidas de la llamada de la funci on.

4.3

feval

Similar al caso de evaluaci on de cadenas de caracteres, tambi en podemos tener evaluaciones de funciones, donde el nombre de las funciones est an contenidas en una cadena de caracteres. Por ejemplo: nuevoX=feval("abs",-3) feval se encarga de la evaluaci on de la funci on dada por la cadena de caracteres, recibe como par ametros el nombre de la funci on y los par ametros de esta. Para mayor informaci on ver la ayuda de Matlab o el manual de Octave.

Funci on Imperativa vs Recursiva

Hasta ahora los ejemplos que hemos manejado son funciones imperativas, es decir funciones que son construidas con ciclos y condicionales y terminan luego de una pasada. Sin embargo existe otro tipo de funci on llamada funci on recursiva. Una funci on recursiva es aquella que recurre a si misma en su declaraci on, en otras palabras se llama a si misma. Veamos un ejemplo de una funci on imperativa y su contraparte recursiva.

Ejemplo 5.1. function x=calculaExponente(x,n)

y=1; if n>0, for i=1:n, y=y*x; endfor endif x=y; Este mismo programa podemos reescribirlo si nos damos cuenta de la relaci on recursiva xn = xxn1 . En otras palabras que para calcular la potencia xn es necesario primero haber calculado xn1 . Ejemplo 5.2. function x=calculaExponente(x,n)

if n==0, y=1; elseif n==1, y=x; else y=x*calculaExponente(x,n-1); endif x=y; En el ejemplo 5.2 el calculo de la potencia se hizo considerando las propiedades recursivas del c alculo de potencias. Esta funci on se llama a ella misma en forma repetida pero en cada llamada el valor al que se le quiere calcular el exponente es disminuido hasta eventualmente llegar al valor de 1 en cuyo caso la funci on retorna el valor de la variable x, para continuar con el resto de las instrucciones de la funci on. Es importante destacar que las funciones de los ejemplos 5.1 y 5.2 producen el mismo resultado, pero las funciones recursivas en general son m as costosas desde el punto de vista de tiempo de ejecuci on y memoria utilizada.

Ejercicios
1. Escriba una funci on que calcule el area bajo una funci on f (x) utilizando sumas de Reimann. Esta funci on debe calcularse usando una partici on de 100 puntos intermedios entre los extremos de los intervalos a menos que la funci on reciba tambi en el n umero de puntos intermedios. Llamadas t picas pueden ser: integral = reimann(f,a,b,N) o integral = reimann(f,a,b) alculo del factorial de un entero positivo. 2. Haga un programa imperativo y otro recursivo que hagan el c Mida el tiempo de ejecuci on en Matlab/Octave usando los comandos etime y clock. 3. Haga un programa recursivo que calcule el determinante de una matriz cuadrada. on imperativa y otra recursiva que eval uen la suma 4. escriba una funci
90

Ri
i=1

5. Escriba una funci on recursiva (y su contraparte imperativa) que calcule el n umero de bonacci F50 , que sigue la siguiente denici on: Fn F1 F2 = Fn1 + Fn2 = 1 = 1

Con qu e tipo de funci on resulta m as conveniente calcular la proporci on divina = Fn /Fn1 ?

You might also like