0% encontró este documento útil (0 votos)
10 vistas117 páginas

Tema4 ProgramacionModular

El documento aborda la programación modular, destacando su importancia para mejorar la productividad en la programación mediante la división de problemas en subproblemas más simples. Se explican conceptos clave como la definición de subprogramas, el ámbito de los identificadores, y la llamada a subprogramas, así como las ventajas del diseño modular. Además, se incluyen ejemplos prácticos y la sintaxis de funciones en C++.

Cargado por

Óscar Marqués
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
10 vistas117 páginas

Tema4 ProgramacionModular

El documento aborda la programación modular, destacando su importancia para mejorar la productividad en la programación mediante la división de problemas en subproblemas más simples. Se explican conceptos clave como la definición de subprogramas, el ámbito de los identificadores, y la llamada a subprogramas, así como las ventajas del diseño modular. Además, se incluyen ejemplos prácticos y la sintaxis de funciones en C++.

Cargado por

Óscar Marqués
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Tema 4: Programación modular

Informática

Curso: 2023/2024
Verónica Romero Gómez

1
Índice

1. Programación modular.
2. Llamada a subprogramas.
3. Definición de subprogramas: funciones
4. Ámbito de los identificadores.
5. Parámetros de un subprograma.
6. Recursividad.

2 Tema 4: Programación modular Asignatura: Informática


Programación modular

 ¿Cómo mejorar la productividad en la programación (creación,


depuración, mantenimiento y actualización)?:
 Sol: Programación estructurada (estructura del programa clara).
1. Sólo estructuras de control secuencial, selectivas y bucles
2. Programación modular (diseño descendente)
 Relacionado con la estrategia “dividir y vencer”
 Implementación: programas propios divididos en subprogramas propios
3. Ámbito de los identificadores limitado
 Sobre todo variables (NO USAR VARIABLES GLOBALES)

3 Tema 4: Programación modular Asignatura: Informática


Programación modular

 Programación modular (diseño descendente)


1. Divide el problema original en subproblemas más sencillos, hasta
que sean lo suficientemente simples para diseñarlos directamente.
2. Se combinan las soluciones a cada subproblema para obtener la
solución final al problema.
3. La solución a cada subproblema se codifica como un subprograma o
módulo propio independiente:
 Sección de código independiente que realiza una tarea específica dentro del
programa.
 Tiene un único punto de entrada y un único punto de salida.
 Comenzando desde la entrada hasta llegar a la salida siempre existe al menos un
camino que lleva al siguiente bloque de instrucciones.

4 Tema 4: Programación modular Asignatura: Informática


Programación modular
 El programa final resulta de la combinación de los subprogramas.

Programa

datos subprograma principal (main) datos

datos datos datos

subprograma 1 subprog. 2 subprog. 3

datos datos datos

subprog. 4 subprog. 5

5 Tema 4: Programación modular Asignatura: Informática


Programación modular

 Ventajas del diseño modular:


 Diseño más eficiente (sobre todo para problemas complejos).
 Programas más claros (entender, depurar, actualizar, etc.)
 Reutilización de código.
 Distribución del desarrollo: Trabajo en equipo.

6 Tema 4: Programación modular Asignatura: Informática


Programación modular

Ejemplo:
Gestión de
Alumnos

Introducir Listar todos Encontrar un


todos alumno

Introducir un Escribir un
alumno alumno

𝑚
𝑛
Ejemplo:  m m!
  =
 n  n!(m − n)! Factorial num

7 Tema 4: Programación modular Asignatura: Informática


Programación modular
 Un subprograma hace el papel de un pequeño programa.

Datos de entrada subprograma Datos de salida


datos parciales (var locales)

 Para conseguir que sea totalmente independiente del resto del programa
no comparten variables:
1. Maneja sus propias variables (locales)
2. Recibe datos de entrada. A estos datos se les denomina parámetros.
 Los parámetros que se pasan al subprograma en la llamada se denominan
parámetros reales (o argumentos).
 Los parámetros que se incluyen en la definición del subprograma se
denominan parámetros formales.
 Son variables locales especiales del subprograma que permiten recoger los datos
de entrada
3. Genera resultados (datos de salida) que pueden recoger las variables locales del
subprograma que invoca al subprograma

8 Tema 4: Programación modular Asignatura: Informática


Programación modular

 A los subprogramas también se les llama funciones, módulos, subrutinas o


procedimientos. Aunque, el nombre función se reserva normalmente para
aquellos subprogramas que devuelven uno o más valores (no todos lo hacen).
 Analogía con las funciones matemáticas:

f(0, 0) = 0
f(0, 1) = 0
𝑥 f(1, 0) = 1
𝑓 𝑥, 𝑦 = f(1, 1) = 0.5
1+𝑦 f(1, 2) = 0.333

nombre parámetros cuerpo


(definición)

9 Tema 4: Programación modular Asignatura: Informática


Índice

1. Programación modular.
2. Llamada a subprogramas.
3. Definición de subprogramas: funciones
4. Ámbito de los identificadores.
5. Parámetros de un subprograma.
6. Recursividad.

10 Tema 4: Programación modular Asignatura: Informática


Llamada a subprogramas
Sintáxis:
 La llamada (o invocación) desde el programa principal (o desde otro
subprograma) se realiza a través de su identificador.
 La llamada va acompañada de los datos de partida del subprograma
(parámetros reales).
Flujo de ejecución
 El programa principal interrumpe su ejecución y pasa a ejecutarse el
subprograma.
 Antes de comenzar la ejecución del subprograma, los parámetros formales
recogen los valores de los parámetros reales.
 Finalizada su ejecución, el resultado generado por el subprograma (si lo
hubiera) es sustituido dentro del programa principal por su llamada.
 La ejecución del resto del programa continua en el punto donde se
interrumpió.

11 Tema 4: Programación modular Asignatura: Informática


Llamada a subprogramas

Programa principal
(u otro subprograma) Subprograma Suma
Parámetros
X Y formales

Inicio

Parámetros
reales 1 3 Z = X+Y

Final

12 Tema 4: Programación modular Asignatura: Informática


Llamada a subprogramas

Programa principal
(u otro subprograma) Subprograma Suma
Parámetros
X Y formales

Inicio

Parámetros
reales 1 3 Z = X+Y

Final

13 Tema 4: Programación modular Asignatura: Informática


Llamada a subprogramas

Programa principal
(u otro subprograma) Subprograma Suma
Parámetros
X Y formales

Inicio

Parámetros
reales 1 3 Z = X+Y

Final

14 Tema 4: Programación modular Asignatura: Informática


Llamada a subprogramas

Programa principal
(u otro subprograma) Subprograma Suma
Parámetros
X Y formales

Inicio

Parámetros
reales 1 3 Z = X+Y

Final

15 Tema 4: Programación modular Asignatura: Informática


Llamada a subprogramas

Programa principal
(u otro subprograma) Subprograma Suma
Parámetros
X Y formales

Inicio

Parámetros
reales 1 3 Z = X+Y

Final

16 Tema 4: Programación modular Asignatura: Informática


Llamada a subprogramas

Programa principal
(u otro subprograma) Subprograma Suma
Parámetros
X Y formales

Inicio

Parámetros
reales 1 3 Z = X+Y

4 Final

17 Tema 4: Programación modular Asignatura: Informática


Llamada a subprogramas
 En el C++ existen varios subprogramas (funciones) ya predefinidos (sqrt, cos,
pow, etc.)

#include <cmath>
#include <iostream>
Funciones
using namespace std;
(bib. Matemática)
int main()
{
float num, res;

cout << “Introduce un numero”;


cin >> num;
res = sqrt(num);
cout << "La Raíz de " << num << " es " << res;
cout << "El coseno de 0.5 es " << cos(0.5 * res);
return 0;
}

18 Tema 4: Programación modular Asignatura: Informática


Llamada a subprogramas

 En C++ todos los subprogramas se llaman funciones (aunque no devuelvan


datos).
 La sintaxis de una llamada (invocación) a una función en C++ es:
variable = nombreFunción(param1, param2, ...);

 La parte de la izquierda es opcional. Sólo se utiliza, si la función devuelve un


resultado y lo queremos recoger.
 Los parámetros o argumentos van separados por comas. El número de argumentos
depende de cada función. Pueden ser variables, constantes o literales (valor
numéricos, caracteres o cadenas de caracteres).
 Una función puede ser invocada desde el programa principal (main) o desde otra
función.
 Existen funciones sin argumentos.

19 Tema 4: Programación modular Asignatura: Informática


Llamada a subprogramas
 Crea un programa que calcule para un valor x real el resultado de la
siguiente expresión matemática:

cos( 2 x)  e x
Ejercicio

20 Tema 4: Programación modular Asignatura: Informática


Índice

1. Programación modular.
2. Llamada a subprogramas.
3. Definición de subprogramas: funciones
4. Ámbito de los identificadores.
5. Parámetros de un subprograma.
6. Recursividad.

21 Tema 4: Programación modular Asignatura: Informática


Definición de subprogramas: funciones
 Programación modular:
 Dividir el programa en un conjunto de subprogramas
 Cada una de ellos se define por separado

 La definición del subprograma fija:


1. El nombre (identificador) de la función
2. La lista de parámetros formales (datos de entrada).
3. Sentencias que definen la tarea a realizar por el subprograma
 Incluye la declaración de otras variables.
4. Tipo de dato y valor de salida.
 El tipo y valor devuelto por el subprograma.

 En C++ los subprogramas se codifican en forma de funciones.

22 Tema 4: Programación modular Asignatura: Informática


Definición de subprogramas: funciones

Definición de funciones en C++

parámetros formales:
tipo de valor Datos que se le pasan a la función
que devuelve con el identificador de la función
(misma normas que var.) (cero, uno o varios parámetros)
return

Cabecera <Tipo> <Nombre>(<lista de parámetros>)


{
<Declaraciones> Conjunto de sentencias que
Cuerpo <sentencias> describen como calcula el
return <Valor>; valor que devuelve (en el
} return)

Devuelve el valor, termina la función y


vuelve al punto donde se llamó

23 Tema 4: Programación modular Asignatura: Informática


Definición de subprogramas: funciones
 Ejemplo:
Nombre de la función
#include <iostream>

float triple(float val)


{
Tipo de float res; Parámetros formales
resultado res = 3 * val;
return (res); Definición de la
} función
Valor devuelto
int main() (dato de salida)
{
float x, y;
Llamadas a la Parámetros reales
x = triple (3) + 2; (datos de entrada )
función
y = triple (1 + x);
cout << triple (y) << endl;
return 0;
}

24 Tema 4: Programación modular Asignatura: Informática


Definición de subprogramas: funciones
 Ejemplo: Función que calcula (x+y)*(x-y)
#include <iostream>
using namespace std; Parámetros formales

int LaFuncion(int p1, int p2)


{
int res; Definición de la
res = (p1+p2)*(p1-p2); función
return(res);
}
Valor
int main() devuelto
{
int num1, num2, resul;
cout << "Primer numero: "; cin >> num1;
cout << "Segundo numero: "; cin >> num2;
Variable que resul = LaFuncion(num1, num2);
recoge el valor cout << "Resultado = " << resul; Llamada a la
return 0; función
}
Parámetros reales
25 Tema 4: Programación modular Asignatura: Informática
Definición de subprogramas: funciones
 Define una función que calcule y devuelva como resultado el factorial de
un número entero x (dato de entrada).
 Con ayuda de esa función crea un programa que calcule el número de
combinaciones diferentes de n elementos escogidos de un conjunto de m
Ejercicio

elementos
 m m!
  =
 n  n!(m − n)!

26 Tema 4: Programación modular Asignatura: Informática


Definición de subprogramas: funciones
Prototipo de la función
 Una función, al igual que las variables y las constantes, precisa ser declarada
antes de ser utilizada desde cualquier punto del programa.

 La declaración de una función se denomina prototipo.


 Describe la forma de invocar a la función y el tipo de resultado que genera.
 Aporta toda la información necesaria para poder llamar a la función.
 El prototipo se construye a partir de la cabecera de la función.

 Los prototipos de las funciones suelen incluirse al inicio del programa.

27 Tema 4: Programación modular Asignatura: Informática


Definición de subprogramas: funciones

Declaración de funciones en C++

parámetros formales:
tipo de valor Datos que se le pasan a la función
que devuelve la identificador de la función
(misma normas que var.) (cero, uno o varios parámetros)
función

<Tipo> <Nombre>(<lista de parámetros>);

Ejemplos:

float suma(float num1, float num2);


float triple(float val);
bool impar(int num);

28 Tema 4: Programación modular Asignatura: Informática


Definición de subprogramas: funciones
 Ej. Programa anterior declarando los prototipos:

#include <iostream>
using namespace std;
Declaración del prototipo
float triple(float); de la función

int main()
{
float x, y;

x = triple(3) + 2;
Llamadas a la función
y = triple(triple(x));
....
}

float triple(float valor)


{ Definición de la función
return (3 * valor);
}

29 Tema 4: Programación modular Asignatura: Informática


Definición de subprogramas: funciones
 Ejemplo:
prototipo de la función
#include <math.h>
#include <iostream.h>

float distan(float , float , float , float );


int main()
{
float p1x, p1y, p2x, p2y;
float res;

cout<< "Coordenadas del primer punto";


cin >> p1x >> p1y;
cout<< "Coordenadas del segundo punto";
Variable cin >> p2x >> p2y;
que
recoge el res = distan(p1x, p1y, p2x, p2y); Llamada a la función
valor cout << "distancia = " << res << endl;
return 0;
}

30 Tema 4: Programación modular Asignatura: Informática


Definición de subprogramas: funciones
Ejemplo: Continua ..
Definición de la función

float distan(float x1, float y1, float x2, float y2)


{
float incx, incy;

incx = x1 – x2;
incy = y1 – y2;

return ( sqrt(incx * incx + incy * incy) );


}

31 Tema 4: Programación modular Asignatura: Informática


Definición de subprogramas: funciones
Procedimientos
 Un tipo especial de subprograma son los procedimientos.
 En C++ se representan como funciones que no devuelven ningún valor
(tipo void).
void EscribeSuma(int , int ); Prototipo
void main()
{
float num;
cout<< "Introduce un numero";
cin >> num; En la sentencia aparece sólo la
EscribeSuma(2, num); llamada a la función
}
void EscribeSuma(int a, int b)
{
cout << a " mas " << b << " es igual a " << a + b;
return;
}

32 Tema 4: Programación modular Asignatura: Informática


Definición de subprogramas: funciones
 Define un procedimiento que muestre por pantalla el inverso de un
número entero x (dato de entrada) siguiendo el siguiente formato: ej.
para x=2: “1 / 2 = 0.5”
 Escribe un programa que le pida al usuario 3 números enteros y muestre
Ejercicio

su inverso siguiendo el anterior formato.

33 Tema 4: Programación modular Asignatura: Informática


Índice

1. Programación modular.
2. Llamada a subprogramas.
3. Definición de subprogramas: funciones
4. Ámbito de los identificadores.
5. Parámetros de un subprograma.
6. Recursividad.

34 Tema 4: Programación modular Asignatura: Informática


Ámbito de los identificadores.
 Zona del programa donde puede utilizarse ese identificador.
 Comienza a partir de su declaración y termina cuando finaliza el bloque en el
que está enmarcado.
En cualquier función
const int DIAS_SEM = 7;
int Semanas( int numdias ){
int numsem = numdias / DIAS_SEM;
return( numsem );
} Dentro de la función Semanas
int main(void ){
int i; Dentro de main
for(i=0; i<10; i++) {
int dias, sem;
Dentro for cout << "Numero de dias: "; cin >>dias;
sem = Semanas(dias);
cout << dias << " dias equivalen a " << sem << "semanas";
}
return 0;
}

35 Tema 4: Programación modular Asignatura: Informática


Ámbito de los identificadores.
 Reglas para el cálculo del ámbito de un identificador:
1. Un identificador declarado en un bloque es local al bloque (sólo es
accesible dentro de ese bloque).
– Un identificador declarado en el cuerpo de una función es local a la función.
– Un parámetro formal es también una variable local a la función.

2. Los identificadores declarados fuera de cualquier bloque son globales y


pueden ser utilizados en cualquier parte del programa.

3. Cuando tenemos un bloque dentro de otro bloque y en ambos se declaran


identificadores con el mismo nombre, el del bloque interno "oculta" al del
bloque externo.

36 Tema 4: Programación modular Asignatura: Informática


Ámbito de los identificadores.
#include <iostream>
using namespace std;
global int z;
int Sumar(int , int );
int main()
{
int suma, x = 27, w = 23; Local a main
z = 3;
suma = Sumar(2, 3);
cout << suma << endl << z << endl << x+w << endl;
return 0;
}
int Sumar(int x, int y)
{
int z, w = 2006; Local a Sumar
Oculta z
global
z = x + y;
return z;
}

37 Tema 4: Programación modular Asignatura: Informática


Ámbito de los identificadores.
 En una función sólo se deben utilizar variables locales a la función o
parámetros (que también son variables locales).
 Las variables globales NO se deben utilizar nunca.
 Rompe la independencia de los subprogramas.
 Se pueden producir efectos colaterales.

int z;
int Sumar(int , int );
Var. global int main()
{
int suma; Antes z = 3
z = 3;
suma = Sumar(2, 3);
cout << z; Después z = 5 (efecto lateral)
}
int Sumar(int x, int y)
{
z = x + y;
return z; La función depende de la existencia de z
}

38 Tema 4: Programación modular Asignatura: Informática


Ámbito de los identificadores.
 Los bloques delimitados por llaves ({ }) no son sólo las funciones. También las
estructuras condicionales, los bucles, etc. pueden tener sus propias variables locales a
esos bloques. Ejemplo:

for (i = 0; i < 10; i++)
{
Variable local al bloque del for (incluyendo el if)
int x = 2*i;
if (x > 10)
{
int y = 2*x;
} Variable local al bloque del if
}

39 Tema 4: Programación modular Asignatura: Informática


Ámbito de los identificadores.
 ¿Qué muestra por pantalla el siguiente programa?
#include <iostream>
using namespace std;
void Muestra(int);
int main()
{
Ejercicio

int x = 3, y = -4; // 1
Muestra(y); // 2
return 0;
}
void Muestra(int x)
{
int y = x; // 3
if(x<0)
{
int x = -y; // 4
cout << "valor absoluto:" << x << endl;
}
cout << "valor: " << x << endl;
return;
}

40 Tema 4: Programación modular Asignatura: Informática


Conclusiones Declaración bool esPrimo(int num);

int main()
{
int val;
 Las funciones permiten dividir un cout << "Escribe un numero: ";
problema en problemas más cin >> val; Llamada a la función
pequeños if (esPrimo(val))
cout << "Es primo“;
 Toda función tiene declaración y else
definición cout << "No es primo“;

 En las funciones debemos usar return 0;


}
siempre variables locales
bool esPrimo(int num)
 El ámbito de las variables locales Definición {
Variables locales
se restringe a la propia función int i;
bool numeroPrimo = true;

for (i=2; i<num; i++)


{
if (num%i == 0)
numeroPrimo = false;
}

return numeroPrimo;
}

41 Tema 4: Programación modular Asignatura: Informática


Conclusiones bool esPrimo(int num);

int main()
{
int val;
Comprobación rápida: cout << "Escribe un numero: ";
cin >> val;
1. La definición y la declaración
coinciden (nombre y tipos) if (esPrimo(val))
cout << "Es primo“;
2. Todas las variables que se utilizan en la else
cout << "No es primo“;
función están declaradas dentro de la
función o son argumentos return 0;
}
3. El valor devuelto (return) coincide con
bool esPrimo(int num)
el tipo de la función {
int i;
4. Las llamadas a la función se bool numeroPrimo = true;
corresponden con la definición
for (i=2; i<num; i++)
{
if (num % i == 0)
numeroPrimo = false;
}

return numeroPrimo;
}

42 Tema 4: Programación modular


Índice

1. Programación modular.
2. Llamada a subprogramas.
3. Definición de subprogramas: funciones
4. Ámbito de los identificadores.
5. Parámetros de un subprograma.
6. Recursividad.

43 Tema 4: Programación modular Asignatura: Informática


Parámetros de un subprograma.
 Existen dos posibilidades a la hora de pasar parámetros a un subprograma:
por valor y por referencia.
Paso por Valor
 En la llamada al subprograma, el valor del parámetro real es asignado al
parámetro formal. El parámetro formal es, por tanto, una copia del
parámetro real.
 Dentro del cuerpo de la función se puede modificar el valor del parámetro formal
(son variables locales), pero ello no altera el valor del parámetro real.
 Se utiliza exclusivamente como parámetros de entrada.
 Todos los ejemplos vistos hasta el momento utilizaban paso de parámetros por
valor.

44 Tema 4: Programación modular Asignatura: Informática


Parámetros de un subprograma.
 Paso por valor: Los valores de las variables, constantes o literales
usados en la invocación se copian a los parámetros formales de la
función.
x = func_pv ( 3, y, y*z +1);
Datos de entrada

int func_pv ( int a, int b, float c )


{
int res;
….
Datos de salida return res;
}

45 Tema 4: Programación modular Asignatura: Informática


Parámetros de un subprograma.
• Ejemplo:

int main()
{
int n;
n = 4;
UnoMenos(n);
cout << n; ¿n?
UnoMenos(5);
UnoMenos(n * 2 - 3);
return 0;
}
void UnoMenos(int x)
{
x = x - 1;
cout << x;
}

46 Tema 4: Programación modular Asignatura: Informática


Parámetros de un subprograma.
• Ejemplo:

int main()
{
int n;
4
n = 4;
UnoMenos(n);
cout << n;
UnoMenos(5);
UnoMenos(n * 2 - 3);
return 0;
}
void UnoMenos(int x)
4
{
x = x - 1;
cout << x;
}

47 Tema 4: Programación modular Asignatura: Informática


Parámetros de un subprograma.
• Ejemplo:

int main()
{
int n; 4
n = 4;
UnoMenos(n);
cout << n;
UnoMenos(5);
UnoMenos(n * 2 - 3);
return 0;
}
void UnoMenos(int x)
3
{
x = x - 1;
cout << x;
}

• n NO CAMBIA su valor.

48 Tema 4: Programación modular Asignatura: Informática


Parámetros de un subprograma.
• Ejemplo:

int main()
{
int n;
4
n = 4;
UnoMenos(n);
cout << n;
UnoMenos(5);
UnoMenos(n * 2 - 3);
return 0;
}
void UnoMenos(int x)
5
{
x = x - 1;
cout << x;
}

49 Tema 4: Programación modular Asignatura: Informática


Parámetros de un subprograma.
 ¿Qué se muestra por pantalla para x = 378?

#include <iostream>
using namespace std;
int PrimeraCifra(int);
int main()
Ejercicio

{
int x, y;
cout << "Introduce el valor: ";
cin >> x; // 1
y = PrimeraCifra(x); // 2
cout << "Primera cifra de " << x << " es " << y << endl;
return 0;
}
int PrimeraCifra(int x)
{
while(x>10)
x = x / 10; // 3
return x;
}

50 Tema 4: Programación modular Asignatura: Informática


Parámetros de un subprograma.
Paso por Referencia.
 La variable usada como parámetro real (argumento) sustituye al parámetro
formal dentro del cuerpo de la función.
 Sólo se pueden pasar por referencia variables.
 El parámetro formal NO es una copia del parámetro real. Son la misma variable
pero con nombres y ámbitos distintos.
 Dentro de la función, cualquier cambio sufrido por el parámetro formal altera al
mismo tiempo al parámetro real.
 Se pueden utilizar como parámetros de entrada y salida al mismo tiempo
 En C++ se marcan con el símbolo & delante del nombre del parámetro para
distinguirlos de los parámetros de paso por valor.

51 Tema 4: Programación modular Asignatura: Informática


Parámetros de un subprograma.
 Paso por referencia:

x = func_pr ( 3, y, z);
Datos de entrada

int func_pr ( int a, int &b, float &c )


{
int res;
….
return res;
}
Datos de salida
x = func_pr ( 3, y, z );

52 Tema 4: Programación modular Asignatura: Informática


Parámetros de un subprograma.
• Ejemplo:
void main()
{
int n;
n = 4;
UnoMenos(n);
cout << n; ¿n?
UnoMenos(5);
UnoMenos(3 + n * 7);
}

void UnoMenos(int & x)


{
x = x - 1;
cout << x;
return;
}

53 Tema 4: Programación modular Asignatura: Informática


Parámetros de un subprograma.
• Ejemplo:
void main()
{
int n;
4
n = 4;
UnoMenos(n);
cout << n;
UnoMenos(5);
UnoMenos(3 + n * 7);
}

void UnoMenos(int & x)


{
x = x - 1;
cout << x;
return;
}

54 Tema 4: Programación modular Asignatura: Informática


Parámetros de un subprograma.
• Ejemplo:
void main()
{
int n;
3
n = 4;
UnoMenos(n);
cout << n;
UnoMenos(5);
UnoMenos(3 + n * 7);
}

void UnoMenos(int & x)


{
x = x - 1;
cout << x;
return;
}

• n CAMBIA su valor. (n y x apuntan a la misma posición de memoria)

55 Tema 4: Programación modular Asignatura: Informática


Parámetros de un subprograma.
• Ejemplo:
void main()
{
int n;
n = 4;
UnoMenos(n);
cout << n;
UnoMenos(5);
UnoMenos(3 + n * 7); INCORRECTO
}

void UnoMenos(int & x)


{
x = x - 1;
cout << x;
return;
}

56 Tema 4: Programación modular Asignatura: Informática


Parámetros de un subprograma.
• Ejemplo:
void main()
{
int a = 3; 5
3
int b = 5;
cout << a << b;
3
5
intercambio(a,b);
cout << a << b;
}
void intercambio(int & x, int & y)
{
int z; 3

z = x; Pantalla
x = y;
y = z; 3 5
return; 5 3
}

57 Tema 4: Programación modular Asignatura: Informática


Parámetros de un subprograma.
 ¿Qué se muestra por pantalla para x = 378?

#include <iostream>
using namespace std;
int PrimeraCifra(int &);
int main()
Ejercicio

{
int x, y;
cout << "Introduce el valor: ";
cin >> x; // 1
y = PrimeraCifra(x); // 2
cout << "Primera cifra de " << x << " es " << y << endl;
return 0;
}
int PrimeraCifra(int &n)
{
while(n>10)
n = n / 10; // 3
return n;
}

58 Tema 4: Programación modular Asignatura: Informática


Parámetros de un subprograma.
 Realiza una función a la cual se le pase dos números enteros (datos de
entrada) y devuelva el cociente y el resto (datos de salida) de la división de
esos dos números.
 Realiza un programa que le pida al usuario cuatro números (x1, x2, x3 y
Ejercicio

x4) y muestre el cociente y el resto de los dos primeros (x1 entre x2) y el
cociente y el resto de los dos últimos (x3 entre x4)

59 Tema 4: Programación modular Asignatura: Informática


Parámetros de un subprograma.
Gestión de la memoria

 La memoria que utilizan las funciones se gestiona como una pila.

 Cuando llamamos a un subprograma, se reserva espacio para las


variables locales “apilando” las variables. Cuando se acaba el
subprograma, las variables son “desapiladas” y por tanto dejan de existir.

60 Tema 4: Programación modular Asignatura: Informática


Parámetros de un subprograma.
void calculo(int , int & );
void subcalculo(int );
void main()
{
int n, s;
n = 5; s = 3;
calculo(n, s);
}
void calculo(int x, int z)
{
int cc;
cc = 6;
subcalculo(cc+x+z);
return;
}
void subcalculo(int y)
{
int dd;
...
return;
}

61 Tema 4: Programación modular Asignatura: Informática


Parámetros de un subprograma.
void calculo(int , int & );
void subcalculo(int );
void main()
{
int n, s;
n = 5; s = 3;
calculo(n, s);
}
void calculo(int x, int z)
{
int cc;
cc = 6;
subcalculo(cc+x+z);
return;
}
void subcalculo(int y)
{
int dd;
...
return;
}
Pila

62 Tema 4: Programación modular Asignatura: Informática


Parámetros de un subprograma.
void calculo(int , int & );
void subcalculo(int );
void main()
{
int n, s;
n = 5; s = 3;
calculo(n, s);
}
void calculo(int x, int z)
{
int cc;
cc = 6;
subcalculo(cc+x+z);
return;
}
void subcalculo(int y)
{
int dd; s
...
return; n
}
Pila

63 Tema 4: Programación modular Asignatura: Informática


Parámetros de un subprograma.
void calculo(int , int & );
void subcalculo(int );
void main()
{
int n, s;
n = 5; s = 3;
calculo(n, s);
}
void calculo(int x, int z)
{
int cc;
cc = 6;
subcalculo(cc+x+z);
return;
}
void subcalculo(int y)
{
int dd; s 3
...
n 5
return;
}
Pila

64 Tema 4: Programación modular Asignatura: Informática


Parámetros de un subprograma.
void calculo(int , int & );
void subcalculo(int );
void main()
{
int n, s;
n = 5; s = 3;
calculo(n, s);
}
void calculo(int x, int z)
{
int cc;
cc = 6;
subcalculo(cc+x+z);
return; z
}
void subcalculo(int y) x
{
int dd; s 3
...
n 5
return;
}
Pila

65 Tema 4: Programación modular Asignatura: Informática


Parámetros de un subprograma.
void calculo(int , int & );
void subcalculo(int );
void main()
{
int n, s;
n = 5; s = 3;
calculo(n, s);
}
void calculo(int x, int z)
{
int cc;
cc = 6;
subcalculo(cc+x+z);
return; z 3
}
void subcalculo(int y) x 5
{
int dd; s 3
...
n 5
return;
}
Pila

66 Tema 4: Programación modular Asignatura: Informática


Parámetros de un subprograma.
void calculo(int , int & );
void subcalculo(int );
void main()
{
int n, s;
n = 5; s = 3;
calculo(n, s);
}
void calculo(int x, int z)
{
int cc;
cc = 6; cc
subcalculo(cc+x+z);
return; z 3
}
void subcalculo(int y) x 5
{
int dd; s 3
...
n 5
return;
}
Pila

67 Tema 4: Programación modular Asignatura: Informática


Parámetros de un subprograma.
void calculo(int , int & );
void subcalculo(int );
void main()
{
int n, s;
n = 5; s = 3;
calculo(n, s);
}
void calculo(int x, int z)
{
int cc;
cc = 6; cc 6
subcalculo(cc+x+z);
return; z 3
}
void subcalculo(int y) x 5
{
int dd; s 3
...
n 5
return;
}
Pila

68 Tema 4: Programación modular Asignatura: Informática


Parámetros de un subprograma.
void calculo(int , int & );
void subcalculo(int );
void main()
{
int n, s;
n = 5; s = 3;
calculo(n, s);
}
void calculo(int x, int z)
{ y
int cc;
cc = 6; cc 6
subcalculo(cc+x+z);
return; z 3
}
void subcalculo(int y) x 5
{
int dd; s 3
...
n 5
return;
}
Pila

69 Tema 4: Programación modular Asignatura: Informática


Parámetros de un subprograma.
void calculo(int , int & );
void subcalculo(int );
void main()
{
int n, s;
n = 5; s = 3;
calculo(n, s);
}
void calculo(int x, int z)
{ y 14
int cc;
cc = 6; cc 6
subcalculo(cc+x+z);
return; z 3
}
void subcalculo(int y) x 5
{
int dd; s 3
...
n 5
return;
}
Pila

70 Tema 4: Programación modular Asignatura: Informática


Parámetros de un subprograma.
void calculo(int , int & );
void subcalculo(int );
void main()
{
int n, s;
n = 5; s = 3;
calculo(n, s);
}
dd
void calculo(int x, int z)
{ y 14
int cc;
cc = 6; cc 6
subcalculo(cc+x+z);
return; z 3
}
void subcalculo(int y) x 5
{
int dd; s 3
...
n 5
return;
}
Pila

71 Tema 4: Programación modular Asignatura: Informática


Parámetros de un subprograma.
void calculo(int , int & );
void subcalculo(int );
void main()
{
int n, s;
n = 5; s = 3;
calculo(n, s);
}
dd ..
void calculo(int x, int z)
{ y 14
int cc;
cc = 6; cc 6
subcalculo(cc+x+z);
return; z 3
}
void subcalculo(int y) x 5
{
int dd; s 3
...
n 5
return;
}
Pila

72 Tema 4: Programación modular Asignatura: Informática


Parámetros de un subprograma.
void calculo(int , int & );
void subcalculo(int );
void main()
{
int n, s;
n = 5; s = 3;
calculo(n, s);
}
void calculo(int x, int z)
{
int cc;
cc = 6; cc 6
subcalculo(cc+x+z);
return; z 3
}
void subcalculo(int y) x 5
{
int dd; s 3
...
n 5
return;
}
Pila

73 Tema 4: Programación modular Asignatura: Informática


Parámetros de un subprograma.
void calculo(int , int & );
void subcalculo(int );
void main()
{
int n, s;
n = 5; s = 3;
calculo(n, s);
}
void calculo(int x, int z)
{
int cc;
cc = 6; cc 6
subcalculo(cc+x+z);
return; z 3
}
void subcalculo(int y) x 5
{
int dd; s 3
...
n 5
return;
}
Pila

74 Tema 4: Programación modular Asignatura: Informática


Parámetros de un subprograma.
void calculo(int , int & );
void subcalculo(int );
void main()
{
int n, s;
n = 5; s = 3;
calculo(n, s);
}
void calculo(int x, int z)
{
int cc;
cc = 6;
subcalculo(cc+x+z);
return;
}
void subcalculo(int y)
{
int dd; s 3
...
n 5
return;
}
Pila

75 Tema 4: Programación modular Asignatura: Informática


Parámetros de un subprograma.
void calculo(int , int & );
void subcalculo(int );
void main()
{
int n, s;
n = 5; s = 3;
calculo(n, s);
}
void calculo(int x, int z)
{
int cc;
cc = 6;
subcalculo(cc+x+z);
return;
}
void subcalculo(int y)
{
int dd; s 3
...
n 5
return;
}
Pila

76 Tema 4: Programación modular Asignatura: Informática


Parámetros de un subprograma.
void calculo(int , int & );
void subcalculo(int );
void main()
{
int n, s;
n = 5; s = 3;
calculo(n, s);
}
void calculo(int x, int z)
{
int cc;
cc = 6;
subcalculo(cc+x+z);
return;
}
void subcalculo(int y)
{
int dd;
...
return;
}
Pila

77 Tema 4: Programación modular Asignatura: Informática


Parámetros de un subprograma.
Traza de Programas:
void P(int & );
int main()
{
int a, b;
1) a = 1;
2) b = 3;
3) P(a);
4) cout <<a<<b<<endl;
return 0;
}
void P(int & c)
{
int b;
5) b = 2;
6) c = c + b + 2;
return;
}

78 Tema 4: Programación modular Asignatura: Informática


Parámetros de un subprograma.
Traza de Programas:
void P(int & );
int main()
{
int a, b;
1) a = 1;
2) b = 3;
3) P(a);
4) cout <<a<<b<<endl;
return 0;
}
void P(int & c) a b
{
int b;
5) b = 2;
6) c = c + b + 2;
return;
}

79 Tema 4: Programación modular Asignatura: Informática


Parámetros de un subprograma.
Traza de Programas:
void P(int & );
int main()
{
int a, b;
1) a = 1;
2) b = 3;
3) P(a);
4) cout <<a<<b<<endl;
return 0;
}
void P(int & c) a b
{ 1) 1 ?
int b;
5) b = 2;
6) c = c + b + 2;
return;
}

80 Tema 4: Programación modular Asignatura: Informática


Parámetros de un subprograma.
Traza de Programas:
void P(int & );
int main()
{
int a, b;
1) a = 1;
2) b = 3;
3) P(a);
4) cout <<a<<b<<endl;
return 0;
}
void P(int & c) a b
{ 1) 1 ?
int b; 2) 1 3
5) b = 2;
6) c = c + b + 2;
return;
}

81 Tema 4: Programación modular Asignatura: Informática


Parámetros de un subprograma.
Traza de Programas:
void P(int & );
int main()
{
int a, b;
1) a = 1;
2) b = 3;
3) P(a);
4) cout <<a<<b<<endl;
return 0;
}
void P(int & c) a b
{ 1) 1 ?
int b; 2) 1 3 c 1 /a b1
5) b = 2; 3) 1 3 1 ?
6) c = c + b + 2;
return;
}

82 Tema 4: Programación modular Asignatura: Informática


Parámetros de un subprograma.
Traza de Programas:
void P(int & );
int main()
{
int a, b;
1) a = 1;
2) b = 3;
3) P(a);
4) cout <<a<<b<<endl;
return 0;
}
void P(int & c) a b
{ 1) 1 ?
int b; 2) 1 3 c 1 /a b1
5) b = 2; 3) 1 3 1 ?
6) c = c + b + 2; 5) 1 3 1 2
return;
}

83 Tema 4: Programación modular Asignatura: Informática


Parámetros de un subprograma.
Traza de Programas:
void P(int & );
int main()
{
int a, b;
1) a = 1;
2) b = 3;
3) P(a);
4) cout <<a<<b<<endl;
return 0;
}
void P(int & c) a b
{ 1) 1 ?
int b; 2) 1 3 c 1 /a b1
5) b = 2; 3) 1 3 1 ?
6) c = c + b + 2; 5) 1 3 1 2
return; 6) 5 3 5 2
}

84 Tema 4: Programación modular Asignatura: Informática


Parámetros de un subprograma.
Traza de Programas:
void P(int & );
int main()
{
int a, b;
1) a = 1;
2) b = 3;
3) P(a);
4) cout <<a<<b<<endl;
return 0;
}
void P(int & c) a b
{ 1) 1 ?
int b; 2) 1 3 c 1 /a b1
5) b = 2; 3) 1 3 1 ?
6) c = c + b + 2; 5) 1 3 1 2
return; 6) 5 3 5 2
} 4) 5 3

85 Tema 4: Programación modular Asignatura: Informática


Parámetros de un subprograma.
 Realiza la traza del siguiente programa:

#include <iostream>
using namespace std;
int cambia(int, int &);
int main()
Ejercicio

{
int x, y, z;
x = 2; y = 5; z = 9; // 1
y = cambia(z, x); // 2
cout << x << ' ' << y << ' ' << z; // 3
}
int cambia(int x, int & y)
{
y = x + 1; // 4
x = y + 1; // 5
return (y + x);
}

86 Tema 4: Programación modular Asignatura: Informática


Índice

1. Programación modular.
2. Llamada a subprogramas.
3. Definición de subprogramas: funciones
4. Ámbito de los identificadores.
5. Parámetros de un subprograma.
6. Recursividad.

87 Tema 4: Programación modular Asignatura: Informática


Recursividad
 La recursividad es un elemento muy empleado en las ciencias de la
computación.
 Permite plantear de forma sencilla y elegante soluciones a problemas que de otra
manera sería muy difíciles de resolver.

 Decimos que algo es recursivo si se define en términos de si mismo, es


decir, cuando para definirse se hace mención a sí mismo.
 Ejemplo: definición de los números naturales.
 El número 0 es natural.
 n es natural si n-1 también lo es.

88 Tema 4: Programación modular Asignatura: Informática


Recursividad
 Un subprograma se denomina recursivo cuando en el cuerpo del
subprograma existe una llamada a sí mismo.
 En cada llamada se crea una nueva instancia de la función.

 El concepto de recursividad va muy ligado al de repetición:


 En cada nueva llamada a si mismo se repite el mismo conjunto de instrucciones
(cuerpo del subprograma).
 Por contra, los algoritmos que utilizan exclusivamente estructuras iterativas para
repetir cálculos se denominan iterativos.

 Para que la recursividad funcione, en algún momento han de


parar las llamadas recursivas (si no, es como un bucle infinito).

89 Tema 4: Programación modular Asignatura: Informática


Recursividad
Definición iterativa del factorial: Definición recursiva del factorial:
n! = 1 * 2 * ... * (n-1) * n 1 si n = 0
n! = 
n * (n − 1)! si n  1

int Factorial( int n ) int Factorial( int n )


{ {
int i; int f;
int f = 1; if (n == 0)
for(i=1; i<=n; i++) f = 1;
f = f * i; else
return f; {
} f = Factorial(n-1);
f = f * n;
}
return f;
}

90 Tema 4: Programación modular Asignatura: Informática


Recursividad
 Secuencia de llamadas para Factorial(4)recursiva

n = 4
if (n == 0)
f = 1; Fase de desplegado
else {
f=Fact(n-1)
f=f*n;
}
return f;
f ?
n 4
Pila

91 Tema 4: Programación modular Asignatura: Informática


Recursividad
 Secuencia de llamadas para Factorial(4)recursiva

n = 4
if (n == 0)
f = 1; Fase de desplegado
else {
f=Fact(n-1) n = 3
f=f*n; if (n == 0) f ?
} f = 1;
return f; else { n 3
f=Fact(n-1)
f=f*n;
f ?
} n 4
return f;
Pila

92 Tema 4: Programación modular Asignatura: Informática


Recursividad
 Secuencia de llamadas para Factorial(4)recursiva

n = 4
if (n == 0)
f = 1; Fase de desplegado f ?
else {
f=Fact(n-1) n = 3
n 2
f=f*n; if (n == 0) f ?
} f = 1;
return f; else { n 3
f=Fact(n-1) n = 2
f=f*n; if (n == 0) f ?
} f = 1; n 4
else {
return f;
f=Fact(n-1) Pila
f=f*n;
}
return f;

93 Tema 4: Programación modular Asignatura: Informática


Recursividad
 Secuencia de llamadas para Factorial(4)recursiva
f ?
n = 4 n 1
if (n == 0)
f = 1; Fase de desplegado f ?
else {
f=Fact(n-1) n = 3
n 2
f=f*n; if (n == 0) f ?
} f = 1;
return f; else { n 3
f=Fact(n-1) n = 2
f=f*n; if (n == 0) f ?
} f = 1; n 4
else {
return f;
f=Fact(n-1) n = 1 Pila
f=f*n; if (n == 0)
} f = 1;
return f; else {
f=Fact(n-1)
f=f*n;
}
return f;

94 Tema 4: Programación modular Asignatura: Informática


Recursividad
f 1
 Secuencia de llamadas para Factorial(4)recursiva n 0
f ?
n = 4 n 1
if (n == 0)
f = 1; Fase de desplegado f ?
else {
f=Fact(n-1) n = 3
n 2
f=f*n; if (n == 0) f ?
} f = 1;
return f; else { n 3
f=Fact(n-1) n = 2
f=f*n; if (n == 0) f ?
} f = 1; n 4
else {
return f;
f=Fact(n-1) n = 1 Pila
f=f*n; if (n == 0)
} f = 1;
return f; else {
f=Fact(n-1) n = 0
f=f*n; if (n == 0)
} f = 1;
else {
Fase de plegado return f;
f=Fact(n-1)
f=f*n;
}
return 1;
95 Tema 4: Programación modular Asignatura: Informática
Recursividad
 Secuencia de llamadas para Factorial(4)recursiva
f 1
n = 4 n 1
if (n == 0)
f = 1; f ?
else {
f=Fact(n-1) n = 3
n 2
f=f*n; if (n == 0) f ?
} f = 1;
return f; else { n 3
f=Fact(n-1) n = 2
f=f*n; if (n == 0) f ?
} f = 1; n 4
else {
return f;
f=Fact(n-1) n = 1 Pila
f=f*n; if (n == 0)
} f = 1;
return f; else {
f=1;
f=1*1;
}
Fase de plegado return 1;

96 Tema 4: Programación modular Asignatura: Informática


Recursividad
 Secuencia de llamadas para Factorial(4)recursiva

n = 4
if (n == 0)
f = 1; f 2
else {
f=Fact(n-1) n = 3
n 2
f=f*n; if (n == 0) f ?
} f = 1;
return f; else { n 3
f=Fact(n-1) n = 2
f=f*n; if (n == 0) f ?
} f = 1; n 4
else {
return f;
f=1; Pila
f=1*2;
}
return 2;

Fase de plegado

97 Tema 4: Programación modular Asignatura: Informática


Recursividad
 Secuencia de llamadas para Factorial(4)recursiva

n = 4
if (n == 0)
f = 1;
else {
f=Fact(n-1) n = 3
f=f*n; if (n == 0) f 6
} f = 1;
return f; else { n 3
f=2;
f=2*3;
f ?
} n 4
return 6;
Pila

Fase de plegado

98 Tema 4: Programación modular Asignatura: Informática


Recursividad
 Secuencia de llamadas para Factorial(4)recursiva

n = 4
if (n == 0)
f = 1;
else {
f=6;
f=6*4;
}
return 24;
f 24
n 4
Pila

Fase de plegado

99 Tema 4: Programación modular Asignatura: Informática


Recursividad
 Traza: fact(3);
int fact(int n)
{
int f;
if (n > 1)
{
2) f = fact(n-1); F
3) f = f * n;
} ?
else
4) f = 1;
return f;
}

1) F = fact (3);

100 Tema 4: Programación modular Asignatura: Informática


Recursividad
 Traza: fact(3);
int fact(int n)
{
int f;
if (n > 1)
{
2) f = fact(n-1); F
3) f = f * n;
} ? n1 f1
else 1) ? 3 ?
4) f = 1;
return f;
}

1) F = fact (3);

101 Tema 4: Programación modular Asignatura: Informática


Recursividad
 Traza: fact(3);
int fact(int n)
{
int f;
if (n > 1)
{
2) f = fact(n-1); F
3) f = f * n;
} ? n1 f1
else 1) ? 3 ? n2 f2
4) f = 1; 21 ) ? 3 ? 2 ?
return f;
}

1) F = fact (3);

102 Tema 4: Programación modular Asignatura: Informática


Recursividad
 Traza: fact(3);
int fact(int n)
{
int f;
if (n > 1)
{
2) f = fact(n-1); F
3) f = f * n;
} ? n1 f1
else 1) ? 3 ? n2 f2
4) f = 1; 21 ) ? 3 ? 2 ? n3 f3
return f; 22 ) ? 3 ? 2 ? 1 ?
}

1) F = fact (3);

103 Tema 4: Programación modular Asignatura: Informática


Recursividad
 Traza: fact(3);
int fact(int n)
{
int f;
if (n > 1)
{
2) f = fact(n-1); F
3) f = f * n;
} ? n1 f1
else 1) ? 3 ? n2 f2
4) f = 1; 21 ) ? 3 ? 2 ? n3 f3
return f; 22 ) ? 3 ? 2 ? 1 ?
}
… 43 ) ? 3 ? 2 ? 1 1
1) F = fact (3);

104 Tema 4: Programación modular Asignatura: Informática


Recursividad
 Traza: fact(3);
int fact(int n)
{
int f;
if (n > 1)
{
2) f = fact(n-1); F
3) f = f * n;
} ? n1 f1
else 1) ? 3 ? n2 f2
4) f = 1; 21 ) ? 3 ? 2 ? n3 f3
return f; 22 ) ? 3 ? 2 ? 1 ?
}
… 43 ) ? 3 ? 2 ? 1 1
1) F = fact (3); 2’)
2 ? 3 ? 2 1

105 Tema 4: Programación modular Asignatura: Informática


Recursividad
 Traza: fact(3);
int fact(int n)
{
int f;
if (n > 1)
{
2) f = fact(n-1); F
3) f = f * n;
} ? n1 f1
else 1) ? 3 ? n2 f2
4) f = 1; 21 ) ? 3 ? 2 ? n3 f3
return f; 22 ) ? 3 ? 2 ? 1 ?
}
… 43 ) ? 3 ? 2 ? 1 1
1) F = fact (3); 2’)
2 ? 3 ? 2 1
32 ) ? 3 ? 2 2

106 Tema 4: Programación modular Asignatura: Informática


Recursividad
 Traza: fact(3);
int fact(int n)
{
int f;
if (n > 1)
{
2) f = fact(n-1); F
3) f = f * n;
} ? n1 f1
else 1) ? 3 ? n2 f2
4) f = 1; 21 ) ? 3 ? 2 ? n3 f3
return f; 22 ) ? 3 ? 2 ? 1 ?
}
… 43 ) ? 3 ? 2 ? 1 1
1) F = fact (3); 2’)
2 ? 3 ? 2 1
32 ) ? 3 ? 2 2
2’)
1 ? 3 2

107 Tema 4: Programación modular Asignatura: Informática


Recursividad
 Traza: fact(3);
int fact(int n)
{
int f;
if (n > 1)
{
2) f = fact(n-1); F
3) f = f * n;
} ? n1 f1
else 1) ? 3 ? n2 f2
4) f = 1; 21 ) ? 3 ? 2 ? n3 f3
return f; 22 ) ? 3 ? 2 ? 1 ?
}
… 43 ) ? 3 ? 2 ? 1 1
1) F = fact (3); 2’)
2 ? 3 ? 2 1
32 ) ? 3 ? 2 2
2’)
1 ? 3 2
31 ) ? 3 6

108 Tema 4: Programación modular Asignatura: Informática


Recursividad
 Traza: fact(3);
int fact(int n)
{
int f;
if (n > 1)
{
2) f = fact(n-1); F
3) f = f * n;
} ? n1 f1
else 1) ? 3 ? n2 f2
4) f = 1; 21 ) ? 3 ? 2 ? n3 f3
return f; 22 ) ? 3 ? 2 ? 1 ?
}
… 43 ) ? 3 ? 2 ? 1 1
1) F = fact (3); 2’)
2 ? 3 ? 2 1
32 ) ? 3 ? 2 2
2’)
1 ? 3 2
31 ) ? 3 6
1’) 6

109 Tema 4: Programación modular Asignatura: Informática


Recursividad
 En toda función recursiva se distinguen al menos dos partes:
 Caso base (o directo): final de la recursión.
 Evita que la recursión continue indefinidamente.
 Caso recursivo: parte puramente recursiva.
 Relaciona el resultado del algoritmo con resultados de casos más simples.

Recursión infinita
int Factorial( int n )
{
Caso
int f; int Factorial( int n )
directo
if (n == 0) {
f = 1; int f;
else
Caso
f = n * Factorial(n-1); f = n*Factorial(n-1);
recursivo

return f; return f;
} }

110 Tema 4: Programación modular Asignatura: Informática


Recursividad
 Implementa una función recursiva que calcule para un valor de
entrada n la suma de todos los números incluidos en el intervalo
[1..n]
Ejercicio

111 Tema 4: Programación modular Asignatura: Informática


Recursividad
 Implementa una función recursiva que muestre por pantalla en
orden inverso las cifras de un número (dato de entrada) realizando
divisiones sucesivas del número por 10 (en cada división, el resto de
dicha división es un dígito del número)
Ejercicio

 Modifica la función para que muestre las cifras en orden directo.

112 Tema 4: Programación modular Asignatura: Informática


Recursividad
 Tipos de recursión:
 Simple (o lineal):
 Una sola llamada recursiva dentro del cuerpo de la función.
 Ejemplo: función factorial.
 Múltiple:
 Varias llamadas recursivas dentro del cuerpo de la función.
 Ejemplo: función de Fibonacci:
int fibonacci(int n)
{
int fib;
Fib0 = 0
if (n = 0 || n = 1)
Fib1 = 1
fib = n;
Fibn = Fibn-2 + Fibn-1 , si n 2
else
fib = fibonacci(n-1)+fibonacci(n-2);
return fib;
}

113 Tema 4: Programación modular Asignatura: Informática


Recursividad
 Árbol de recursión:

Fac torial(5)
Fib(4)
120
5
Fib(2) Fib(3)
Fac torial(4)
2 3
24
Fib(0) Fib(1) Fib(1) Fib(2)
Fac torial(3)
1 1 1 2
6
Fib(0) Fib(1)
Fac torial(2) 1 1
2

Fac torial(1)
1

Fac torial(0)
1

114 Tema 4: Programación modular Asignatura: Informática


Recursividad
Algoritmos recursivos frente a iterativos.
 Cualquier algoritmo recursivo se puede expresar, con mayor o menor
esfuerzo, de forma iterativa con bucles.
 No siempre es sencillo encontrar una versión iterativa. Un ejemplo es el
problema de las torres de Hanoi.
 El juego está formado por tres agujas. En la primera de las agujas hay engarzados N
discos de diferentes tamaños. El juego consiste en pasar todos los discos de la
primera aguja a la tercera aguja, en el mismo orden creciente, pasando un solo
disco en cada movimiento sin engarzar un disco más grande sobre uno más
pequeño.

A B C
115 Tema 4: Programación modular Asignatura: Informática
Recursividad
1.- Mover N-1 discos de A a B.
Estrategia:
 Pasar N - 1 discos de A a B

Pasar N discos de A a C =  Mover un disco de A a C
 Pasar N - 1 discos de B a C

A B C

2.- Mover 1 disco de A a C.

A B C

3.- Mover N-1 discos de B a C.

A B C
116 Tema 4: Programación modular Asignatura: Informática
Recursividad
 Siguiendo la anterior estrategia, implementa una función recursiva que
solucione el problema de las torres de Hanoi para n discos.

 El prototipo de la función será el siguiente:


Ejercicio

void Hanoi(int n, char ini, char aux, char fin);

 Si llamamos a la función desde la función principal con los siguiente


parámetros: Hanoi(4, ‘A’, ‘B’, ‘C’);
se generará como resultado la siguiente salida por pantalla
Mover disco 1 de A a B Mover disco 4 de A a C
Mover disco 2 de A a C Mover disco 1 de B a C
Mover disco 1 de B a C Mover disco 2 de B a A
Mover disco 3 de A a B Mover disco 1 de C a A
Mover disco 1 de C a A Mover disco 3 de B a C
Mover disco 2 de C a B Mover disco 1 de A a B
Mover disco 1 de A a B Mover disco 2 de A a C
Mover disco 1 de B a C

117 Tema 4: Programación modular Asignatura: Informática

También podría gustarte