Está en la página 1de 44

Tema-5.-Metodos.

pdf

user_4333106

Programación

1º Desarrollo de Aplicaciones Multiplataforma

Estudios España

Reservados todos los derechos.


No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Programación
Tema 5. Abstracción funcional
Ciclo Formativo Grado Superior:

Desarrollo de Aplicaciones Web

Curso 2020-2021

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9687077

Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Contenidos
• Métodos en Java. Definición. Tipo devuelto. Terminación. Paso de
parámetros. Sobrecarga.
• Variables locales. Duración y alcance. Variables de instancia y
automáticas. La referencia this.
• Abstracción funcional en los lenguajes de programación. Funciones y
procedimientos. Tipos de parámetros.
• Recursión. Definición. Ejemplos. Recursión frente a iteración.

Al final de este capítulo debe ser capaz de escribir métodos en el contexto de las
clases Java utilizando los tipos primitivos del lenguaje y conocerá la recursión como
una herramienta para encontrar soluciones a problemas complejos.

Abstracción funcional 2

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9687077

Las descargas sin publicidad se realizan con las coins


Programación

Banco de apuntes de tu clase


Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Métodos en Java

• Definición de métodos.
• Tipo devuelto por un método.
• Terminación de métodos: return.
• Parámetros de un método.
• Sobrecarga de métodos. Firma y prototipo de un método.

Abstracción funcional 3

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9687077

Las descargas sin publicidad se realizan con las coins


Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Definición de métodos en Java
Método: Sección de código autocontenida que pertenece a una clase y que
define la parte del comportamiento del sistema correspondiente a dicha clase
y a sus objetos.

Sintaxis:
[Modificadores] tipoDevuelto identificadorMetodo([argumentos])
{
// cuerpo del método
}

Ejemplo: public int maximoDosNumeros(int n1, int n2)

• Los modificadores son las palabras reservadas public, protected, private,


final y static (se verán en temas posteriores).
• Lo que aparece entre corchetes es opcional.

Abstracción funcional 4

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9687077

Las descargas sin publicidad se realizan con las coins


Métodos en Java
Observaciones:
La tarea asignada a un método debe estar bien definida.
El nombre de un método debe indicar exactamente lo que
hace (mediante un verbo).
Los métodos deben tener una longitud adecuada.
Métodos demasiado extensos hacen difícil su comprensión y
depuración.

Abstracción funcional 5

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9687077

Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Métodos en Java: ¿Dónde se declaran?
En Java no existen métodos fuera de las clases
→ Todos los métodos se definen en el interior de una clase.
No es posible definir métodos dentro de métodos.

class UnaClase { class UnaClase {


// variables. public int metodo1(int x1, int x2){ }
// métodos. public int metodo2(boolean ffllaagg)){{ }
} public int metodo3(){ }
}

La clase es un tipo de datos definido por el usuario → Tipo Abstracto de Datos.


La clase define: → Los atributos de los objetos:
→ La interfaz que exponen los objetos.
→ El comportamiento de los objetos: su implementación.
Las clases se explicarán con detalle en temas posteriores.

Abstracción funcional 6

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9687077

Las descargas sin publicidad se realizan con las coins


Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Tipo devuelto por un método
Tipo devuelto: Es el tipo del valor devuelto al objeto que invocó al
método. Puede ser la palabra reservada void, un tipo primitivo Java
o una clase .

Se devuelve un valor double pow(double d1, double d2)


primitivo Java.

No se devuelve void pintarCirculo(float radio)


nad a.

Se devuelve una Coche cocheConMasMultas()


referencia a
String substring(int start, int end)
objetos.

Abstracción funcional 7

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9687077

Las descargas sin publicidad se realizan con las coins


Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Terminación de métodos: return.
Dos posibilidades:
Si el método devuelve void (nada) el Si el método devuelve algo distinto de void
método termina cuando llega al final del método entonces se devuelve el control mediante:
(cierra llaves) o cuando hace return. return expresión
pub lic void p intaCircul o(float r) { donde expresión produce un valor cuyo tipo es
// código para pinta r el círcu lo el declarado en la cabecera del método.
} / / este es el final d el método
// Cá lculo de x y
int p otencia(in t x, int y ){
pub lic void s aluda(Stri ng mensaje ){
in t contador = 0, resu ltado = 1;
if ( (prime raVez))
wh ile (conta dor != y){
return; // aquí termina
resultado = resulta do * x;
else contador+ +;
System. out.printl n(mensaje) ; }
} // aquí se de vuelve el resultado.
re turn resul tado;
}

Abstracción funcional 8

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9687077

Las descargas sin publicidad se realizan con las coins


Terminación de métodos: return.
Cuando se hace return se devuelve el control al invocador del método.
Código del Código del
Registro de Activación
llamante (f1) llamado (f2)
... Parámetros.
...
llamada
Código de la Valor de retorno.
y = f 2( x) función
... Dirección de retorno.
retorno Datos locales.
...

Es un error de compilación cuando se devuelve Es un error de compilación no hacer return


siendo void el tipo de retorno. cuando hay que devolver un valor de un tipo.

pub lic void s aluda(Stri ng mensaje ){ int potencia(i nt x, int y){


if ( (prime raVez)) i nt contado r =0, resu ltado = 1;
return false; // error w hile (cont ador != y) {
else resultad o = result ado * x;
System. out.printl n(mensaje) ; contador ++;
} }
/ / Error: N o se retor na valor
}

Abstracción funcional 9

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9687077

Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Lista de parámetros de un método
La lista de parámetros (argumentos) es una lista de las declaraciones
de parámetros que se pasan al método para su ejecución.

La lista puede estar vacía pero los paréntesis son obligados:


public void suficiente() // Correcto
public void pocaCosa // Error de sintaxis.

Es obligatorio indicar el tipo de cada parámetro:


double potencia (double x, double y) // Correcto
double potencia (double x, y) // Error de ssiinnttaaxxiiss

Abstracción funcional 10

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9687077

Las descargas sin publicidad se realizan con las coins


Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Parámetros formales y parámetros reales
Parámetros formales: Los que se definen en la cabecera de la función.
Parámetros reales: Los que aparecen en la llamada a la función. Deben
corresponderse con los parámetros formales definidos en la cabecera.

Parámetros formales Los argumentos de entrada


int f ( int n, boolean t ) deben coincidir en número
y tipo y aparecer en el
mismo orden con los
public static void main(String [] args){ declarados en el método.
int k = 3;
boolean flag = true;
// Llamadas correctas: Parámetros reales
f(7, false); f(7, false);
f(0, flag);
f(k, flag);
// Llamadas incorrectas:
// No hay concordancia entre parámetros reales y formales
f(true, d, flag);
f(false, 7);
}

Abstracción funcional 11

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9687077

Las descargas sin publicidad se realizan con las coins


Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Promoción de argumentos. Coerción.
Consideremos la siguiente cabecera de un método:
public static double sqrt(double d)

Y el siguiente uso del método:


int numero = 4;
System.out.println(Math.sqrt(numero));

Java promociona implícitamente el argumento de int a double antes de


pasarlo a sqrt(), pasando 4.0 en lugar de 4.

A esto se le llama coerción de argumentos y sigue determinadas reglas de


promoción.
Las reglas de promoción especifican cómo los tipos pueden convertirse a otros
sin que haya pérdida de información.

Abstracción funcional 12

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9687077

Las descargas sin publicidad se realizan con las coins


Reglas de promoción de argumentos.
Reglas de promoción:
Ti p o Promociones permitidas
double ninguna (no hay tipo más grande que double)
float double
long float o double
int long, float o double
char int, long, float o double
short int, long, float o double
byte short, int, long, float o double
boolean ninguna (ni true ni false son números)

• Estas reglas se aplican en la coerción de argumentos y en las expresiones que contienen


dos o más tipos de datos.
• Los valores originales de las variables no se modifican: temporalmente se promocionan.
• Las conversiones a tipos más pequeños sólo es posible haciendo conversión explícita
mediante casting. Puede perderse información.

Abstracción funcional 13

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9687077

Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Parámetros por valor y por referencia
Los parámetros de los métodos se pueden pasar por valor o por referencia.

Paso de Parámetros por Valor: Paso de Parámetros por Referencia:


Se le pasa al método una copia del valor. Se le pasa al método una referencia a los
Los cambios realizados dentro del método datos.
no afectan a la variable que se utilizó como El método invocado puede modificar los
parámetro. datos del invocador.
Ofrece seguridad. Se ahorra memoria (no se copian los datos).

Algunos lenguajes ofrecen la posibilidad de elegir si los parámetros se pasan por


valor o se pasan por referencia.

→ En Java, los tipos primitivos siempre se pasan por valor y los


objetos siempre por referencia.
→ Esto también ocurre para las variables del la sentencia return.

Abstracción funcional 14

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9687077

Las descargas sin publicidad se realizan con las coins


Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Mecanismos de paso de parámetros

Celdas Direcciones de memoria


... 39 9 9
Parámetro por valor: 25 40 0 0 Parámetro por referencia:

Se pasa a la función ... 40 0 1 Se pasa a la función la


una copia del valor 40 0 2 dirección de memoria en la
...
del parámetro real que se encuentra el
(25) parámetro (4000)

Abstracción funcional 15

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9687077

Las descargas sin publicidad se realizan con las coins


Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Parámetros por valor y por referencia
Ejemplo de Paso por Valor:
void intercambio(int x, int y){
int auxiliar;
auxiliar = y;
y = x;
x = auxiliar;
}
Supongamos la siguiente llamada:
int num1 = 1;
int num2 = 2;
objA.intercambio(num1, num2);

¿Qué valor tienen num1 y num2 después de la llamada?

Abstracción funcional 16

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9687077

Las descargas sin publicidad se realizan con las coins


Paso de arrays como parámetros
• Los arrays son objetos y por tanto se pasan por referencia.

• La referencia se pasa por valor

• Para pasar un array como parámetro escribimos el nombre del array en la


lista de parámetros (sin corchetes)
int temperaturasHorarias[] = new int[24];
modificarArray(temperaturasHorarias);

• El nombre del array es en realidad una referencia a un objeto que contiene los
elementos del array.

Abstracción funcional 17

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9687077

Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Paso de arrays como parámetros.
cla ss Paso_Ar rays_1 {

static int a[] = {0, 1, 2, 3, 4};

public sta tic void m odificarAr ray(int b[ ]){ // P or referen cia


for (in t j = 0; j < b.length ; j++ ) b[ j] *= 2;
}

public sta tic void m odificarEl emento(int e){ // P or valor


e *= 2;
}

public sta tic void m ain(String [] args){


modific arArray(a) ; // desp ués de lla mada a = { 0, 2, 4, 6 , 8}
modific arElemento (a[3]); / / después de llamada a[3] = 6;
}
}

Abstracción funcional 18

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9687077

Las descargas sin publicidad se realizan con las coins


Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Paso de arrays como parámetros
cla ss Paso_Ar rays_2 {

int static a[] = {1, 2, 3};

public sta tic void m odificarAr ray(int a[ ]){


int [] b = {4, 5, 5};
a[0] = b[0];
b[1] = a[1];
a = b;
// ¿qué se imprime ?
for (in t i = 0; i < a.lengt h; i++) Sy stem.out.p rintln(a[i ]);
}

public sta tic void m ain(String [] args){


modific arArray(a) ;
// ¿qué se imprim e?
for (in t i = 0; i < a.lengt h; i++) Sy stem.out.p rintln(a[i ]);
}
}

Abstracción funcional 19

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9687077

Las descargas sin publicidad se realizan con las coins


Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Sobrecarga de métodos. Firma y prototipo de un método
Sobrecarga de métodos: Java permite definir métodos con el mismo nombre
siempre que difieran en los argumentos de entrada.

• Un método se distingue del resto por su firma.

Firma del método: nombre + argumentos de entrada.

• Puesto que los métodos sobrecargados tienen el mismo nombre, los métodos
sobrecargados se diferencian por el número, tipo y orden de los argumentos en su lista de
parámetros.

publi c class ut ilidadesMa tematicas{


in t squar e(int x) { return x* x; }
do uble squar e(double x ) { return x*x; }
}

El prototipo de un método es la firma más el tipo devuelto.

Los métodos sobrecargados no se distinguen por el prototipo sino por la firma.

Abstracción funcional 20

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9687077

Las descargas sin publicidad se realizan con las coins


Variables locales. Duración y Alcance.

• Variables locales.
• Duración y alcance de las variables.
• Variables de instancia y automáticas.
• Referencia this.

Abstracción funcional 21

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9687077

Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Variables locales en los métodos
Declaración de variables locales
[mod ificador] tipoValorD evuelto no mbre([argu mentos]){
/ / declarac ión de var iables loc ales
/ / enunciad os
}

Las variables pueden ser de tipos primitivos o de referencias a objetos.


void intercamb io(int x, int y){
int aux iliar; // Varia ble local.
auxilia r = y;
y = x;
x = aux iliar;
}

Un método puede usar variables locales y aquellas definidas fuera del método. Puede
haber coincidencia de nombres. ¿Cómo distinguirlas?.
→ La respuesta viene dada por la duración y alcance de las variables.

Abstracción funcional 22

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9687077

Las descargas sin publicidad se realizan con las coins


Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Duración y alcance de las variables
• La duración y reglas de alcance se aplican a todos los
identificadores de un programa Java y definen dónde y cómo
pueden usarse los identificadores.

• La duración (tiempo de vida) de un identificador es el tiempo


durante el cual la información está accesible.

• El alcance (ámbito) de un identificador determina qué parte del


programa ve dicho identificador.

Abstracción funcional 23

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9687077

Las descargas sin publicidad se realizan con las coins


Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Variables de instancia y automáticas
Variables de instancia o de ejemplar:
class Recorrido_Array {
• Se definen en una clase, no en un método.
int a[][] = { {1,2}, {4} };
• Existen desde que se carga la clase en
public int suma_array( ) {
memoria hasta el final del programa.
int total = 0;
• Si no tienen valores iniciales asignados el
compilador los asigna por defecto (a 0 y for (int i = 0; i < a.length; i++){
System.out.println(i);
false). System.out.println(j); // error.
for (int j = 0; j < a[i].length; j++)
Variables automáticas: total += a[i][j];
}
• Se crean cuando se entra en el bloque System.out.println(i); // error.
(porción de código entre llaves) en el que return total;
se declaran . }
}
• Existen desde que se declaran y mientras
se está en el bloque en el que se declaran.
• Deben inicializarse explícitamente antes de Es un error de sintaxis definir una variable local con el mismo
ser usadas. nombre que uno de los argumentos del método.
• Los parámetros y variables locales a un En Java los bloques pueden anidarse, pero los métodos no.
método son variables automáticas. (No es posible definir un método dentro de otro).

Abstracción funcional 24

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9687077

Las descargas sin publicidad se realizan con las coins


La referencia this.
Las variables locales pueden recibir el class Recorrido_Array {
mismo nombre que las variables de int total;
instancia. public void suma_array(int a[]) {
int total = 0;
Cuando una variable local se llama igual que
for (int i = 0; i < a.length; i++)
una de instancia, oculta a la de instancia total += a[i];
dentro de su ámbito. this.total += ttoottaall;;
} Mejor así
Para referirnos a la variable de instancia }
debemos calificar al nombre de la variable
con this. class Recorrido_Array {

int total;
No obstante, no es, en general, una buena
public void suma_array(int a[]) {
práctica dar los mismos nombres a variables
int subtotal = 0;
de instancia y variables locales.
for (int i = 0; i < a.length; i++)
Lo mismo ocurre si consideramos bloques. subtotal += a[i][j];

Las variables más internas ocultan a las más total += subtotal;


}
externas que tengan el mismo nombre. }

Abstracción funcional 25

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9687077

Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Un ejemplo de alcance de variables
public class Alcance {
int x = 10;
private static int f1(int x){
x = 1;
return x *= 2;
}
private static void f2(){
Cuestión 1: Solución
x -= 1;
} x = 2
public static void main (String [] args){ x = 10
int x = 5; x = 2
x = f1(x); x = 9
System.out.println("x = " + x );
System.out.println("x = " + this.x);
x = 2
f2(); x = 2
x = f1(this.x);
System.out.println("x = " + x );
System.out.println("x = " + this.x);
this.x = f1(x);
System.out.println("x = " + x );
System.out.println("x = " + this.x);
}
}

Abstracción funcional 26

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9687077

Las descargas sin publicidad se realizan con las coins


Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Abstracción funcional

• Las funciones como mecanismo de abstracción.


• Funciones y procedimientos.
• Tipos de parámetros.

Abstracción funcional 27

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9687077

Las descargas sin publicidad se realizan con las coins


Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Abstracción funcional
Función: Sección de código (conjunto de instrucciones) autocontenida que
puede recibir datos de entrada y producir datos de salida.
→ Abstracción funcional: las funciones se invocan para realizar
una tarea, pero sin necesidad de saber cómo la llevan a cabo.

Dicho de otra manera:


• Una función es un subprograma con un nombre determinado, que realiza una tarea
específica ccuuaannddoo es iinnvvooccaaddoo (llamado) y ooppcciioonnaallm
meennttee ddeevvuueellvvee un resultado (el
valor de retorno).
• Las funciones usan una lista de parámetros que define:
→ Los datos que el llamante de la función pasa a la misma.
→ Los datos que la función devuelve al llamante (excepto el valor de retorno).

Abstracción funcional 28

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9687077

Las descargas sin publicidad se realizan con las coins


Las funciones cómo mecanismo de abstracción
• Las funciones se utilizan como herramientas de abstracción (separación)
porque su comportamiento (lo que hacen) puede ser separado (abstraido)
de su implementación (cómo lo hacen).
Lista de parámetros
Cabecera del método:
Nombre de la función:
Especifica lo que hace y
Tipo del valor devuelto: int Cube ( int n ) qué necesita
{
return n * n * n ; Cuerpo del método:
}
D
Deeffiinnee el cómo

La abstracción funcional está estrechamente ligada a las técnicas de


diseño funcional descendente y a la programación estructurada.
Usando una técnica de descomposición funcional un problema complejo
puede descomponerse en subproblemas más sencillos, cada uno de los
cuales puede expresarse como una llamada a función.

Abstracción funcional 29

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9687077

Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Las funciones cómo mecanismo de abstracción
La abstracción funcional permite llevar a cabo el concepto de modularidad:
– Una función agrupa a un conjunto de instrucciones altamente cohesionadas
– Una función realiza una tarea específica.
– Para usar una función no es necesario conocer su implementación.

Las funciones similares se agrupan en bibliotecas (en java en clases):


– Funciones matemáticas
– Funciones trigométricas
– Funciones para el manejo de cadenas de caracteres
– etc.

Los lenguajes de programación suelen proporcionarse con un conjunto de


bibliotecas estándar en las que se definen funciones de uso común.

Abstracción funcional 30

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9687077

Las descargas sin publicidad se realizan con las coins


Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Funciones y Procedimientos
Aunque hasta ahora sólo hemos hablado de funciones, se suele ddiissttiinngguuiirr entre ffuunncciioonneess
y procedimientos:

Las funciones se corresponden con la Los procedimientos agrupan sentencias que


noción matemática de función: producen realizan una tarea bien definida, pero no
un resultado que es función de los datos tienen por qué devolver un resultado.
de entrada:  Se corresponden con el concepto de
 y = f(x1, x2,...xn) instrucción.

 Una función bien definida no modifica los  Los procedimientos actúan sobre el entorno y
parámetros de entrada. pueden modificar los parámetros de entrada
(efectos colaterales → side effects).
 Se utilizan en expresiones.

Los procedimientos pueden verse como una forma de extender las sentencias del lenguaje,
mientras que las funciones pueden verse como una extensión de los operadores:
 Cuando se invoca una función se obtiene un valor a través de un valor de retorno.
 Cuando se invoca un procedimiento el efecto es una modificación del entorno del
llamante, de la cual éste es advertido a través de los valores de los parámetros de salida.
Abstracción funcional 31

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9687077

Las descargas sin publicidad se realizan con las coins


Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Llamadas a función o procedimiento
Código del Código del Pila (stack)
Memoria
llamante (f1) llamado (f2) Guarda datos asociados
a funciones (registro de
.. . Datos asociados
activación):
a f2
llamada
.. . Código de Parámetros. Datos asociados
la a f1
y = f2(x) Valor de retorno.
f unción
Dirección de retorno. crece
.. .
retorno Datos locales.

.. . crece
Datos dinámicos
Montículo (heap)
Otr os datos

Có digo

Una función puede invocar a otras funciones e incluso a sí misma (recursión).

Abstracción funcional 32

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9687077

Las descargas sin publicidad se realizan con las coins


Tipos de parámetros
En algunos lenguajes se distingue entre tres tipos de parámetros:
• Parámetros de Entrada: Son parámetros de sólo lectura, cuyo valor no
puede ser modificado por el procedimiento o función.
• Parámetros de salida. Son parámetros de sólo salida. El procedimiento o
función no puede leer su valor, únicamente cambiarlo.
• Parámetros de entrada y salida. El procedimiento o función puede leerlos y
escribirlos.

Obsérvese que para las funciones sólo tienen sentido los parámetros de
entrada:
• Un usuario de una función quiere un resultado, no la modificación de sus datos.
• Sería bueno que el lenguaje de programación no ppeerrm
miittiieerraa oottrrooss ttiip
pooss de parámetros
para las funciones para evitar efectos laterales.
• Sin embargo, la mayor parte de los lenguajes de programación no imponen
ninguna restricción.

Abstracción funcional 33

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9687077

Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Recursión

• Definición.
• Ejemplos.
• Recursión frente a iteración.

Abstracción funcional 34

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9687077

Las descargas sin publicidad se realizan con las coins


Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Recursión
La recursión es una técnica de programación mediante la cual los
procedimientos y funciones se llaman a sí mismos.

→ La recursión se utiliza cuando es difícil encontrar o implementar una solución


basada en bucles.
→ Ciertos problemas tienen una solución más fácil y elegante cuando en su solución
se emplea un método que se llama a sí mismo.

Por ejemplo, el cálculo del // Definició n recursiv a del méto do


número factorial de un número // factorial .
entero n: pu blic long factorial( long numer o){
if(numero == 0) ret urn 1;
0! = 1, por definición. else
return numero * factorial( numero-1);
n! = n * (n-1)!
}

Abstracción funcional 35

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9687077

Las descargas sin publicidad se realizan con las coins


Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Recursión
La recursión puede emplearse si:

1. Existe un caso base que tiene solución no recursiva (el caso del cero).
0! = 1, por definición.
Si el método recursivo ha llegado al caso base devuelve un resultado:
if(numero == 0) return 1;

2. Si no se ha llegado al caso base, el método se llama a sí mismo, pero considerando un


problema más pequeño (n!= n * (n-1)!):
else return numero * factorial(numero-1);
La parte del problema que no se sabe resolver debe ser más pequeña que la actual:
n - 1 es más pequeño que n.

3. Los problemas pequeños en los que se va diviendo el más grande deben converger
(como las series matemáticas) al caso base, si no, será infinita su ejecución.

Abstracción funcional 36

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9687077

Las descargas sin publicidad se realizan con las coins


Recursión
5! 5!
Devuelve → 120
5 * 4! 5 * 4!
Devuelve → 24
4 * 3! 4 * 3!
Devuelve → 6
3 * 2! 3 * 2!
Devuelve → 2
2 * 1! 2 * 1!
Devuelve → 1
1 1

La devolución del caso base desencadena una devolución de valores de manera


ascendente hasta la primera ejecución del método.

Abstracción funcional 37

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9687077

Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Recursión: serie de Fibonacci
La serie de Fibonacci comienza en 0 y 1 y tiene la propiedad de que cada número de
Fibonacci es la suma de los dos números de Fibonacci previos.

Cada llamada recursiva particiona el problema de tamaño n en dos de tamaño menor que
convergen al caso base pues n-1, n-2, n-3, ... ccoonnvveerrggeenn a 1 y a 0.

casos base: En Java:


Fibo nacci(0) = 0 Fibon acci(1) = 1 lo ng fibonac ci(long n) {
if(n == 0 || n == 1 ) return n ;
División del problema else
Fibo nacci(n) = return fibonacci (n-1) +
Fibonacc i(n-1) + F ibonacci(n -2) fibonacci (n-2);
}

Abstracción funcional 38

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9687077

Las descargas sin publicidad se realizan con las coins


Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Recursión: serie de Fibonacci
Fibonacci(3)
f(3)

ret urn f(2) + f(1)

return f(1f
f(2)) + f(0) return 1
(2)

return 1 return 0

Abstracción funcional 39

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9687077

Las descargas sin publicidad se realizan con las coins


Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Recursión e iteración
• Tanto recursión como iteración hacen uso de estructuras de control.
→ La recursión usa el condicional.
→ La iteración usa un bucle.
• Ambas requieren una condición de terminación.
• Ambas se aproximan gradualmente a la terminación.
→ La iteración conforme se acerca al cumplimiento de una condición.
→ La recursión conforme se divide el problema en otros más pequeños.

• Ambas pueden tener (por error) una ejecución potencialmente infinita.


• Si existe versión recursiva entonces existe versión iterativa.

Abstracción funcional 40

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9687077

Las descargas sin publicidad se realizan con las coins


Recursión: ventajas e inconvenientes
• La recursión requiere más memoria:
Cada vez que se invoca un
→ Calcular fibonacci(20) requiere 21.891 método se guardan en la
llamadas. pila:
→ Calcular fibonacci(30) requiere 2.692.537 • Las variables locales del
llamadas. procedimiento o función.

• La recursión es costosa en tiempo y recursos, • Copias locales de los


p e ro ... parámetros.

→ Refleja de manera más natural la solución a • La dirección de retorno.


un problema lo que hace que sea más fácil
de depurar y entender, además...
→ La solución iterativa no siempre es
inmediata.

Abstracción funcional 41

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-9687077

Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.

También podría gustarte