Docsity
Docsity

Prepara tus exámenes
Prepara tus exámenes

Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity


Consigue puntos base para descargar
Consigue puntos base para descargar

Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium


Orientación Universidad
Orientación Universidad


recursividad practica, Apuntes de Informática

asdasdasdasdasdasdas das das d asd a da sd asd ad a

Tipo: Apuntes

2019/2020

Subido el 31/10/2020

mike-wasouski
mike-wasouski 🇧🇴

1 documento

1 / 50

Toggle sidebar

Esta página no es visible en la vista previa

¡No te pierdas las partes importantes!

bg1
Fundamentos de Programación II
Tema 2. Recursividad
Luís Rodríguez Baena (luis.r[email protected])
Universidad Pontificia de Salamanca (campus Madrid)
Escuela Superior de Ingeniería y Arquitectura
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25
pf26
pf27
pf28
pf29
pf2a
pf2b
pf2c
pf2d
pf2e
pf2f
pf30
pf31
pf32

Vista previa parcial del texto

¡Descarga recursividad practica y más Apuntes en PDF de Informática solo en Docsity!

Fundamentos de Programación II

Tema 2. Recursividad

Luís Rodríguez Baena ([email protected]) Universidad Pontificia de Salamanca (campus Madrid) Escuela Superior de Ingeniería y Arquitectura

Naturaleza de la recursividad

Se dice que un

objeto es

recursivo

cuando forma parte de

si mismo.

● Permite definir un número infinito

de objetos mediante un enunciadofinito.

En programación…

Luis Rodríguez Baena, Escuela Superior de Ingeniería y Arquitectura, 2012

En programación…

● La recursividad es la propiedad que

tienen los procedimientos yfunciones de llamarse a si mismospara resolver un problema.

● Permite describir un número infinito

de operaciones de cálculo medianteun programa recursivo finito

sin

implementar de forma explícitaestructuras repetitivas.

Partes de un algoritmo recursivo

Un algoritmo recursivo genera larepetición de una o másinstrucciones (como un bucle).

Como cualquier bucle puedecrear un bucle infinito.
Es necesario establecer unacondición de salida para terminar la recursividad.
entero : función
Recursiva(…)
… inicio
… devolver
(Recursiva(…))
fin_función

Luis Rodríguez Baena, Escuela Superior de Ingeniería y Arquitectura, 2012

terminar la recursividad.

Para evitar un bucle infinito, unalgoritmo recursivo tendrá:

Caso trivial, caso base o fin derecursión.



La función devuelve un valorsimple sin utilizar la recursión(0! = 1).

Parte recursiva o caso general.



Se hacen llamadas recursivasque se van aproximando al casobase.

entero : función
Recursiva(…)
… inicio
… si
entonces
//Caso base devolver
si_no
//Parte recursiva devolver
(Recursiva(…))
fin_si …
fin_función

Tipos de recursividad



Según el subprograma al quese llama, existen dos tipos derecursión:

Recursividad simple o directa.

La función incluye una referenciaexplícita a si misma.
devolver(recursiva(…))

procedimiento

Recursivo()

… inicio

… Recursivo(…)…

fin_función

Recursividad directa

procedimiento

Recursivo1()

Luis Rodríguez Baena, Escuela Superior de Ingeniería y Arquitectura, 2012

devolver(recursiva(…))

Recursividad mutua o indirecta.

El módulo llama a otros módulosde forma anidada y en la últimallamada se llama al primero.

… inicio

… Recursivo2(…)…

fin_función procedimiento

Recursivo2()

… inicio

… Recursivo1(…)…

fin_función

Recursividad indirecta

Tipos de recursividad (III)

Luis Rodríguez Baena, Escuela Superior de Ingeniería y Arquitectura, 2012

Llamadas a módulos recursivos



Llamadas anidadas (no recursivas).

Luis Rodríguez Baena, Escuela Superior de Ingeniería y Arquitectura, 2012

Llamadas a módulos recursivos (III)

El problema de sumar números entre 1 y n se puede definir en funciónde su tamaño (n), el problema se puede dividir en partes máspequeñas del mismo problema y se conoce la solución del caso mássimple (caso base, suma(1) = 1). Por inducción se puede suponer quelas llamadas más pequeñas (por ejemplo, Suma(n-1)) quedanresueltas.

Luis Rodríguez Baena, Escuela Superior de Ingeniería y Arquitectura, 2012

Suma(4) = 4 + Suma(3)
Suma(3) = 3 + Suma(2)
Suma(2) = 2 + Suma(1)
Suma(1) = 1 (caso base)
devuelve 1
devuelve 3
devuelve 6
devuelve

Llamadas a módulos recursivos (IV)



En el caso del factorial…

Por definición, 0! = 1,

Para cualquier número entero mayor que 0, n! = n * (n-1)!



En este problema:

La solución de n! puede ser definida en función de su tamaño (n).

Se puede dividir en instancias más pequeñas (<n) del mismo problema.

Se conoce la solución de las instancias más simples (n=0).

Por inducción, las llamadas más pequeñas (<n) pueden quedar resueltas.



Sabemos que 4! = 4 * 3!

Conclusión: Se puede resolver por recursividad.

Luis Rodríguez Baena, Escuela Superior de Ingeniería y Arquitectura, 2012



Conclusión: Se puede resolver por recursividad.

4! = 4 * 3!

3! = 3 * 2!

2! = 2 * 1!

1! = 1 * 0!

0! = 1 (caso base)

1 * 1

devuelve 1

=

2 * 1

devuelve 1

=

3 * 2

devuelve 2

=

4 * 6

devuelve 6

=

devuelve 24

Llamadas a módulos recursivos (V)

La pila de llamadas a subrutinas.

● Una estructura de tipo

pila

es una estructura de datos en la que la

información se añade y se elimina por un extremo llamado cima.

El último elemento que entra en la pila es el primero que sale.

● El

registro de activación de procedimientos

es un bloque de

memoria que contiene información sobre las constantes, variables locales y parámetros que se pasan al procedimiento, junto con la

Luis Rodríguez Baena, Escuela Superior de Ingeniería y Arquitectura, 2012

locales y parámetros que se pasan al procedimiento, junto con la información de la dirección de retorno de esa llamada.

● Cada vez que se llama a un procedimiento (sea o no una llamada

anidada, sea o no una llamada recursiva) se almacena el registro deactivación del procedimiento en la pila de llamadas a subrutinas.

Cuando el procedimiento termina, su registro de activación se desapila,volviendo a la dirección de retorno que se ha almacenado yrecuperando el estado de las constantes, variables locales yparámetros.

Llamadas a módulos recursivos (VI)



En cada llamada a la función factorialcarga en la pila de llamadas su registrode activación (cómo en cualquierllamada a una subrutina).

El último registro de activación queentra es el primero que sale.
Aunque los identificadores sean losmismos no existe ambigüedad:



Siempre se refieren al ámbito en el que han sido declarados

.

Luis Rodríguez Baena, Escuela Superior de Ingeniería y Arquitectura, 2012

han sido declarados

.



Cuando se llega al caso base (n< 1),el registro de activación se desapila yel flujo de control del programaregresa a la última llamada que se hahecho (cuando n=1), devolviendoademás el valor de retorno (1).



Los registros de activación se vandesapilando, restaurando los valoresanteriores de n y devolviendo losvalores de retorno de cada una dellamadas recursivas a la función (1, 1,2, 6, 24).

Algoritmos recursivos (II)

escribir

(Potencia(2,5))

x=2, y=5 devolver

(

Potencia(2,4))

x=2, y=4 devolver

(

Potencia(2,3))

x=2, y=

2 * 8

2 * 16

Luis Rodríguez Baena, Escuela Superior de Ingeniería y Arquitectura, 2012

x=2, y=3 devolver

(

Potencia(2,2))

x=2, y=2 devolver

(

Potencia(2,1))

x=2, y=1 devolver

(

Potencia(2,0))

x=2, y=0 devolver

(1)

1

2 * 1

2 * 2

2 * 4

Algoritmos recursivos (III)



Escribir un número decimal en binario.

Caso base: si n < 2 n en binario es n.

Si n >= 2, n en binario es la división entera de n entre 2 en binarioseguido del resto de dividir n entre 2.



2 en binario es

2

div

2

en binario (1), seguido de

2

mod

2

(0)



10

.



3 en binario es

3

div

2

en binario (1), seguido de

3

mod

2

(1)



11

.

Luis Rodríguez Baena, Escuela Superior de Ingeniería y Arquitectura, 2012



3 en binario es

3

div

2

en binario (1), seguido de

3

mod

2

(1)



11

.

procedimiento
EscribirEnBinario(
valor entero
: n)
inicio
si
n < 2
entonces
//Escribe n sin hacer un salto de línea escribir
(n)
si_no
EscribirEnBinario(n
div
//Escribe n mod 2 sin hacer salto de línea escribir
(n
mod
fin_si
fin_procedimiento

Algoritmos recursivos (IV)



La secuencia leída decaracteres es h,o,l,a,Intro.

Las acciones que se realicendespués de la llamada recursivase ejecutarán en orden inverso alas llamadas.

Lo que ocurre en la recursión “decola”.

Leer y escribir caracteres hasta que se pulsa

Intro

Luis Rodríguez Baena, Escuela Superior de Ingeniería y Arquitectura, 2012

que se pulsa

Intro

procedimiento

LeerCaracteres()

var

carácter

:

car

inicio

leer

(car)

si

código

(car)

<>

13

LeerCaracteres() escribir

(car)

fin_si

fin_procedimiento

Algoritmos recursivos (V)

lógico

función

esPar(

valor

entero

:n)

inicio

si

n

= 0

entonces

devolver

(

verdad

)

si_no

devolver

(esImpar(n-1))

fin_si

fin_funciónlógico

función

esImPar(

valor entero

:n)

inicio



Ejemplo de recursividad mutuao indirecta.

Determinar si un númeroentero positivo es par.

esPar(3)

falso

falso

devuelve falso

=

devuelve falso

Luis Rodríguez Baena, Escuela Superior de Ingeniería y Arquitectura, 2012

inicio

si

n

= 0

entonces

devolver

(

falso

)

si_no

devolver

(esPar(n-1))

fin_si

fin_función //Ejemplo de llamada si

esPar(5)

entonces

...

esImpar

(

2

)

esPar(1)

esImpar(0) (Caso base)

devuelve falso

falso

falso =

devuelve falso

=

esImPar(3)

esPar(2)

esIMPar(1)

esPar(0) (Caso base)

devuelve verdad

verdad

= verdad

devuelve verdad

= verdad

devuelve verdad

=

devuelve verdad

esPar(4)

verdad

devuelve verdad