Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Introducción a la programación
Directa
n=4
n! = n*(n-1)*(n-2)* … 2*1*1 4! = 4*3*2*1*1 = 24
Recurrencia y recursividad.
En Pascal:
● Subprogramas recursivos.
● En el cuerpo del subprograma aparece una llamada a sí mismo.
● No tiene ninguna sintaxis especial.
Proceso de llamada
Proceso de llamada
Subprograma
PROCEDURE Pr1 (...);
…
BEGIN Subprograma
… PROCEDURE Pr1 (...);
Pr1(...); …
… BEGIN Subprograma
END; …
PROCEDURE Pr1 (...);
Pr1(...); Subprograma
…
…
BEGIN
END; PROCEDURE Pr1 (...);
…
…
Pr1(...);
BEGIN
…
END;
…
END;
FacRec (4)⇒4*6 ⇒ 24
Oriol Borrás Gené @OriolTIC
4.1. Conceptos básicos
● Caso base:
○ Dados los parámetros de entrada, la solución del problema es
“simple”.
○ No se generan llamadas recursivas, y se devuelve directamente una
solución.
Ejemplo: 0! = 1
● Caso recurrente:
○ Caso más complejo: no hay solución trivial.
○ Se reduce a otro caso más simple.
Ejemplo: 4! = 4*3!
¿Procedimiento o función?
n*(n-1)! si n>0
n! =
1 si n=0
Oriol Borrás Gené @OriolTIC
4.1. Conceptos básicos
○ Usar una estructura de selección (IF o CASE), para distinguir entre caso base
y caso recurrente.
○ Asegurar que los parámetros de la llamada recursiva sean diferentes de los
de entrada (condición necesaria para que “se acerquen” al caso base).
○ No olvidar asignar el resultado de la función recursiva a su nombre.
○ En los programas recursivos sencillos, no suele ser necesario usar bucles.
Suma lenta:
Ejercicio 3. Escribir un
subprograma recursivo que
escriba los dígitos de un
número entero en orden
inverso. Utilizar recursividad.
PROGRAM invertirnum;
VAR
numero :integer;
Ejemplo:
numero = 2456
4.2. Recursividad lineal
numero = 2456
num = ?
m=?
2 invertir = ?
numero = 2456
num = 2456
m=0
2 invertir = ?
3
4
5
num = 245
invertir (245,0*10+6) 6 m=6
1 invertir = ?
invertir (245,6)
7
8 invertir (24,6*10+5)
num = 24 13
9
m = 65 invertir (24,65) num = 0
14 m = 6542
invertir = ?
15 invertir = ?
10
invertir (0,6542)
10
num = 2
invertir (2,65*10+4) 11 num = 0
m = 654 m = 6542
invertir = ? invertir = 6542
invertir (2,654) 12
4.2. Recursividad lineal
numero = 2456
num = 2456
m=0
invertir = ?
23
24 invertir = 6542
25
21
invertir = 6542
22
15
19
20 invertir = 6542
16
num = 0
m = 6542
invertir = 6542
invertir = 6542 17
18
4.2. Recursividad lineal
Ejemplos:
● Números de Fibonacci, polinomio de Hermite, etc.
● Algoritmo recursivo para las Torres de Hanoi.
CASO BASE
Fib0 = 0
Fib1 = 1
Fib2 = Fib0 + Fib1 CASO RECURSIVO
4 3
3 2 2 1
2 1 1 0 1 0
1 0
Torres de Hanoi
Juego de sencilla solución recursiva.
Situación inicial:
• 3 agujas verticales A, B y C
• En una de ellas hay n discos de tamaño creciente.
A B C
n=4
Torres de Hanoi
Objetivo: Pasar los n discos en el mismo orden a otra aguja.
Restricciones:
• Los discos se pasan de uno en uno.
• Un disco NUNCA debe descansar sobre otro de menor tamaño.
A B C
n=4
Torres de Hanoi
Objetivo: Pasar los n discos en el mismo orden a otra aguja.
Restricciones:
• Los discos se pasan de uno en uno.
• Un disco NUNCA debe descansar sobre otro de menor tamaño.
A B C
n=4
Torres de Hanoi
Algoritmo.
● Caso n=1:
○ Pasar 1 disco de A → B (trivial)
A B C A B C
num= 0
origen= ‘A’
destino = ‘C’
auxiliar = ‘B’
7
12 10
num= 0
origen= ‘C’
destino = ‘B’
auxiliar = ‘A’
11
6
num= 0
origen= ‘A’
7
destino = ‘B’ 10
auxiliar = ‘C’ hanoi (1-1, ‘A’ , ‘B’, ‘C’);
9
>> Pasar disco 1 de
AaC
4.3. Recursividad múltiple (Pascal)
Torres de Hanoi (n=2)
num= 2
origen= ‘A’
destino = ‘B’
3 auxiliar = ‘C’
4
num= 1
hanoi (2-1, ‘A’ , ‘C’, ‘B’); origen= ‘A’
5 destino = ‘C’
auxiliar = ‘B’
6
num= 0
origen= ‘B’
7
destino = ‘B’ 10
auxiliar = ‘A’ hanoi (1-1, ‘B’ , ‘C’, ‘A’); 11
12
13
>> Pasar disco 1 de
AaC
4.3. Recursividad múltiple (Pascal)
Torres de Hanoi (n=2)
num= 2
origen= ‘A’
destino = ‘B’
3 auxiliar = ‘C’
4
num= 1
hanoi (2-1, ‘A’ , ‘C’, ‘B’); origen= ‘A’
5 destino = ‘C’
14 auxiliar = ‘B’
6
num= 0
origen= ‘B’
7
destino = ‘B’ 10
auxiliar = ‘A’ hanoi (1-1, ‘B’ , ‘C’, ‘A’); 11
12
13
>> Pasar disco 1 de
AaC
4.3. Recursividad múltiple (Pascal) >> Pasar disco 2 de
AaB
16
num= 0
origen= ‘C’
17
destino = ‘A’ 20
auxiliar = ‘B’ hanoi (1-1, ‘C’ , ‘A’, ‘B’);
18
19
>> Pasar disco 1 de
AaC
4.3. Recursividad múltiple (Pascal) >> Pasar disco 2 de
AaB
>> Pasar disco 1 de
CaB
Torres de Hanoi (n=2)
num= 2
origen= ‘A’
destino = ‘B’
3 auxiliar = ‘C’
4
num= 1
hanoi (2-1, ‘C’ , ‘B’, ‘A’); origen= ‘C’
5 destino = ‘B’
13 auxiliar = ‘A’
14
24 16
num= 0
origen= ‘A’
17
destino = ‘B’ 20
auxiliar = ‘C’ hanoi (1-1, ‘A’ , ‘B’, ‘C’); 21
22
23
4.3. Recursividad múltiple
Torres de Hanoi
A B C
Algoritmo.
● Caso n=2 (pasar 2 discos de A a B):
○ Mover disco de A → C
○ Mover disco de A → B Punto de partida
○ Mover disco de C → B
A B C A B C A B C
A B C
Torres de Hanoi A B C
Algoritmo.
● Caso n=3 (pasar 3 discos de A → B) Paso 1
1. 2 discos de A → C:
a. mover A → B A B C
b. mover A → C
c. mover B → C
Paso 2
2. 1 disco de A → B
3. 2 discos de C → B: A B C
a. mover C → A
mover C → B
mover A → B Paso 3
Oriol Borrás Gené @OriolTIC
4.3. Recursividad múltiple
Torres de Hanoi
Algoritmo.
● Caso general (pasar n discos de A → B):
○ Pasar n-1 discos de A → C
○ Mover disco de A → B
○ Pasar n-1 discos de C → B
Torres de Hanoi
Codigo en Pascal
Torres de Hanoi
Traza
Isidoro Hernán
Torres de Hanoi
Traza (n=4) 1. Se pasa el disco 1 de A a C
2. Se pasa el disco 2 de A a B
Llamada hanoi (4,A,B,C): 3. Se pasa el disco 1 de C a B
4. Se pasa el disco 3 de A a C
5. Se pasa el disco 1 de B a A
6. Se pasa el disco 2 de B a C
7. Se pasa el disco 1 de A a C
8. Se pasa el disco 4 de A a B
9. Se pasa el disco 1 de C a B
10. Se pasa el disco 2 de C a A
11. Se pasa el disco 1 de B a A
12. Se pasa el disco 3 de C a B
13. Se pasa el disco 1 de A a C
14. Se pasa el disco 2 de A a B
15. Se pasa el disco 1 de C a B
Oriol Borrás Gené @OriolTIC
4.3. Recursividad múltiple
Torres de Hanoi
Traza (n=4)
Llamada hanoi (4,A,B,C):
hanoi (4,’A’,’B’,’C’)
hanoi (3,’A’,’C’,’B’)
hanoi (2,’A’,’B’,’C’)
hanoi (1,’A’,’C’,’B’)
hanoi (0,’A’,’B’,’C’)
Se pasa el disco 1 de A a C
hanoi (0,’B’,’C’,’A’)
Se pasa el disco 2 de A a B
hanoi (1,’C’,’B’,’A’)
hanoi (0,’ ...)
Se pasa el disco 1 de C a B ...
Oriol Borrás Gené @OriolTIC
4.3. Recursividad mutua
Sintaxis:
● Predeclaración del segundo subprograma con la palabra reservada
FORWARD.
Sintaxis:
● EsPar(n):
○ TRUE si n=0
○ EsImpar(n–1) si n>0
● EsImpar (n):
○ FALSE si n=0
○ EsPar(n–1) si n>0
PROGRAM esParImpar;
Ejemplo: Escribir funciones para VAR n: integer;
● Iteración:
○ Bucles (WHILE, REPEAT, FOR).
● Recursión:
○ Subprogramas que se llaman a sí mismos.
● Ejemplos:
○ Factorial: fac y facRec.
○ Suma lenta: sumaLenta y sumaLentaRec.
○ Nº de Fibonacci: fib y fibIter.
● Claridad:
○ Muchos problemas se resuelven de forma “elegante”
mediante recursión, requiriendo programas complejos y/o
poco intuitivos en su versión iterativa.
Ejemplo: las Torres de Hanoi.
● Eficiencia:
○ Hay que tener en cuenta también la complejidad añadida
por la recursión.
Ejemplo: los números de Fibonacci.
Utilizar recursividad: