Está en la página 1de 20

Recursividad

La recursividad consiste en definir una entidad en funcin de si misma


En programacin la recursividad nos da la posibilidad de definir
un tipo de datos en funcin de si mismo, o bien nos permite
definir un problema en funcin de si mismo.
Recursividad de Definicin : aplicada a Estructuras de Datos
Posibilidad de definir un tipo de datos en trminos de si mismo.
public class Nodo {
protected Object elemento;
protected Nodo siguiente;
public Nodo!
/* Crea un nuevo objeto nodo */
{ }
...
}
Recursividad de Ejecucin : aplicada a los problemas
Posibilidad de definir un problema en funcin del propio problema.
Recursividad de Ejecucin o Recursividad Funcional
Es a"uella "ue se aplicada a la solucin de los problemas #
define el problema en funcin del propio problema, lo cual
consiste en "ue mtodo puede llamarse as mismo una o varias
veces.
En la recursividad de ejecucin se distingue:
a) Recursividad Directa: Consiste en que un mtodo se llama a si
mismo desde uno (recursividad simple) varios puntos del cdigo
(recursividad mltiple)
b) Recursividad !ndirecta o "uta: Consiste en que dos mtodos se
llaman entre si, es decir, mutuamente.
#ara poder implementar un mtodo de forma recursiva$ es necesario %ue se
cumplan las siguientes condiciones:
a) Que pueda definirse en trminos de si mismo.
b) Que exista un criterio de finalizacin, llamado &aso 'ase$ llegado
el cual no se aplique de nuevo la llamada recursiva.
c) Que en cada llamada recursiva se este ms cerca de que se cumpla
el Caso Base.
d) Que se resuelva el problema en un tiempo limitado o finito.
Un eemplo claro de mtodo recursivo es el calculo del factorial de un
numero entero ($ que puede definirse de forma recursiva o de forma
iterativa
Solucin Iterativa Si X >= 0 X! = $ ! $ " $ # $ $$$ $ X
Solucin %ecursiva Si X = 0 X! =
Si X > 0 X! = X $ &X%'!
Solucin Iterativa Solucin Recursiva
public static int factorialint &! public static int factorialint &!
' '
int fact ( )* if & (( +!
for int i()* i,( &* i--! return )*
' else
fact ( fact $ i* return & $ factorial& . )!!*
/ /
return fact*
/
Ejercicio:
Escribir un programa que calcule todos los factoriales del 1 hasta el valor
entero N que se introduce por teclado, el valor de N es maor de cero!
Ejemplo de una ejecucin:
Introduce un nu(ero) *#
Introduce un nu(ero) 0
Introduce un nu(ero) #
! =
!! = * ! = !
"! = * ! * " = +
#! = * ! * " * # = !#
public class Calculo,el-actorial
{
public static int factorialint &!
'
0
/
public static void (ain&Strin./0 ar.s'
{
int n = 0;
do{
S1ste($out$print&2Introdu3ca un nu(ero) 2';
n = 4tilidades$leer5ntero&';
} 67ile & n 8 ';
S1ste($out$println&';
9or &int i=; i8= n; i::'
{
S1ste($out$print&i : 2! = 2';
9or &int j=; j 8 i; j::'
{
S1ste($out$print&j : 2 * 2';
}
S1ste($out$println&i : 2 = 2 : factoriali!';
}
}
}
)olucion !terativa:
public class Calculo,el-actorial
{
public static int factorialint &!
'
int fact ( )*
for int i()* i,( &* i--!
'
fact ( fact $ i*
/
return fact*
/
public static void (ain&Strin./0 ar.s'
{
public static void (ain&Strin./0 ar.s'
{
int n = 0;
do{
S1ste($out$print&2Introdu3ca un nu(ero) 2';
n = 4tilidades$leer5ntero&';
} 67ile & n 8 ';
S1ste($out$println&';
9or &int i=; i8= n; i::'
{
S1ste($out$print&i : 2! = 2';
9or &int j=; j 8 i; j::'
{
S1ste($out$print&j : 2 * 2';
}
S1ste($out$println&i : 2 = 2 : factoriali!';
}
}
}
)olucion Recursiva:
public class Calculo,el-actorial
{
public static int factorialint &!
'
if & (( +!
return )*
else
return & $ factorial& . )!!*
/
public static void (ain&Strin./0 ar.s'
{
int n = 0;
do{
S1ste($out$print&2Introdu3ca un nu(ero) 2';
n = 4tilidades$leer5ntero&';
} 67ile & n 8 ';
S1ste($out$println&';
9or &int i=; i8= n; i::'
{
S1ste($out$print&i : 2! = 2';
9or &int j=; j 8 i; j::'
{
S1ste($out$print&j : 2 * 2';
}
S1ste($out$println&i : 2 = 2 : factoriali!';
}
}
}
Ejercicio:
"ise#ar un m$todo que calcule la potencia de un numero real elevado a
un entero!
)olucion !terativa:
public static double potenciadouble base, int e&p!
'
double pot ( )*
for int i()* i,( e&p* i--!
'
pot ( pot $ base*
/
return pot*
/
)olucion Recursiva:
public static double potenciadouble base, int e&p!
'
if e&p (( +!
return )*
else
return base $ potenciabase, e&p . )!!*
/
Ejercicios:
1!% Escribir un m$todo que calcule la suma de los N primeros n&meros naturales!
N ' 5 1 + 2 + 3 + 4 + 5 = 15
N ' 5 5 + 4 + 3 + 2 + 1 = 15
Suma (N) N * Suma(N%1)
+!% Escribir un m$todo que visualice los N primeros n&meros naturales del 1 al N!
N ' 4 visuali,a los numeros 1
2
3
4
-!% Escribir un m$todo que visualice los N primeros n&meros naturales del N al 1!
N ' 4 visuali,a los numeros 4
3
2
1
.!% Escribir un m$todo que visualice los d/gitos de un n&mero natural N al rev$s
N ' 7815 visuali,ar el numero 5187
0!% Escribir un m$todo que visualice los d/gitos de un n&mero natural N, uno por l/nea!
N ' 7815 visuali,ar el numero 7
8
1
5
1!% Escribir un m$todo que sirva para subraar un te2to!
Ejercicios:
1!% Escribir un m$todo que calcule la suma de los N primeros n&meros naturales!
public static int sumaint n! version )
'
if n (( +!
return +*
else
return n - suman . )!!*
/
public static int sumaint n! version 1
'
if n (( )!
return )*
else
return n - suman . )!!*
/
+!% Escribir un m$todo que visualice los N primeros n&meros naturales del 1 al N!
public static void visuali2aint n!
'
if n 3 +!
'
visuali2an%)!*
4#stem.out.printlnn!*
/
/
-!% Escribir un m$todo que visualice los N primeros n&meros naturales del N al 1!
public static void visuali2aint n!
'
if n 3 +!
'
4#stem.out.printlnn!*
visuali2an%)!*
/
/
.!% Escribir un m$todo que visualice los d/gitos de un n&mero natural N al rev$s
N ' 7815 visuali,ar el numero 5187
public static void visuali2arDigitos5evesint n!
'
if n , )+!
'
4#stem.out.printlnn!*
/
else
'
4#stem.out.printn 6 )+!*
visuali2arDigitos5evesn 7 )+!*
/
/
0!% Escribir un m$todo que visualice los d/gitos de un n&mero natural N, uno por linea!
N ' 7815 visuali,ar el numero 7
8
1
5
public static void visuali2arDigitosint n! '
if n , )+!
4#stem.out.printlnn!*
else
'
int digito ( n 6 )+ *
visuali2arDigitosn 7 )+!*
4#stem.out.printlndigito!*
/
/
1!% Escribir un m$todo que sirva para subraar un te2to!
public static void subra#arint longitud! '
if longitud 3 +! '
4#stem.out.print89:!*
subra#arlongitud%)!*
/
/
Ejercicio Recursividad en concha

Dado el siguiente programa Java disear un mtodo para sumar los elementos
de un vector de enteros.
public static void main4tring;< args!
'
int ;< vNumeros ( '), =, >, ?, @, )), )=/*
int suma (sumarArra# vNumeros!*
4#stem.out.printlnsuma!*
/
public static int sumarArra#int ;< a!

'
0
/
Solucion Iterativa
public static void (ain&Strin./0 ar.s'
{
int /0 v;u(eros = {< "< =< >< ?< < "};
int su(a = sumarArra# vNumeros!*
S1ste($out$println&su(a';
}
public static int sumarArra#int ;< a!

'
int acumulador ( +*
for int pos(+* pos , a.lengtB* pos--!
'
acumulador ( acumulador - a;pos<*
/
return acumulador*
/
Solucion Recursiva 31 Recorre el arra desde el principio hacia el final
public static void (ain&Strin./0 ar.s'
{
int /0 v;u(eros = {< "< =< >< ?< < "};
int su(a = sumarArra# vNumeros!*
S1ste($out$println&su(a';
}
public static int sumarArra#int ;< a!
'
return sumarArra#5eca, +!*
/
public static int sumarArra#5ecint ;< a, int pos!
'
if pos (( a.lengtB!
return +*
else
return a;pos< - sumarArra#5eca, pos - )!*
/
Solucion Recursiva3+ Recorre el arra desde el final hacia el principio
public static void (ain&Strin./0 ar.s'
{
int /0 v;u(eros = {< "< =< >< ?< < "};
int su(a = sumarArra# vNumeros!*
S1ste($out$println&su(a';
}
public static int sumarArra#int ;< a!
'
return sumarArra#5eca, a.lengtB%)!*
/
public static int sumarArra#5ecint ;< a, int pos!
'
if pos , +!
return +*
else
return a;pos< - sumarArra#5eca, pos % )!*
/
Solucion Recursiva3- Recorre el arra desde el final hacia el principio
public static void (ain&Strin./0 ar.s'
{
int /0 v;u(eros = {< "< =< >< ?< < "};
int su(a = sumarArra# vNumeros!*
S1ste($out$println&su(a';
}
public static int sumarArra#int ;< a!
'
return sumarArra#5eca, a.lengtB%)!*
/
public static int sumarArra#5ecint ;< a, int pos!
'
if pos (( +!
return a;pos<*
else
return a;pos< - sumarArra#5eca, pos % )!*
/
Ejercicio Recursividad en concha
Dado el siguiente programa Java disear un mtodo para visualizar los
elementos de un vector de enteros.
public static void main4tring;< args!
'
int ;< vNumeros ( '), =, >, ?, @, )), )=/*
visuali2arArra# vNumeros!*
/
public static void visuali2arArra#int ;< a!

'
0
/
Solucin Iterativa
public static void (ain&Strin./0 ar.s'
{
int /0 v;u(eros = {< "< =< >< ?< < "};
visuali2arArra# vNumeros!*
}
public static void visuali2arArra#int ;< a!
'
for int pos(+* pos , a.lengtB* pos--!
'
4#stem.out.printlna;pos<!*
/
/
Solucin Recursiva31 4isuali,a los elementos del principio hacia el final
public static void (ain&Strin./0 ar.s'
{
int /0 v;u(eros = {< "< =< >< ?< < "};
visuali2arArra# vNumeros!*
}
public static void visuali2arArra#int ;< a!
'
visuali2arArra#5eca, +!*
/
public static void visuali2arArra#5ecint ;< a, int pos!
'
if pos , a.lengtB!
'
4#stem.out.println a;pos< !*
visuali2arArra#5eca, pos - )!*
/
/
Solucin Recursiva3+ 4isuali,a los elementos del principio hacia el final
public static void (ain&Strin./0 ar.s'
{
int /0 v;u(eros = {< "< =< >< ?< < "};
visuali2arArra# vNumeros!*
}
public static void visuali2arArra#int ;< a!
'
visuali2arArra#5eca, +!*
/
public static void visuali2arArra#5ecint ;< a, int pos!
'
if pos , a.lengtB!
'
4#stem.out.println a;pos< !*
visuali2arArra#5eca, pos - )!*
/
/
Solucin Recursiva3- 4isuali,a los elementos del final hacia el principio
public static void (ain&Strin./0 ar.s'
{
int /0 v;u(eros = {< "< =< >< ?< < "};
visuali2arArra# vNumeros!*
}
public static void visuali2arArra#int ;< a!
'
visuali2arArra#5eca, a.lengtB%)!*
/
public static void visuali2arArra#5ecint ;< a, int pos!
'
if pos (( +!
4#stem.out.println a;pos< !*
else
'
4#stem.out.println a;pos< !*
visuali2arArra#5eca, pos % )!*
/
/
Ejercicio Recursividad en concha
Dado el siguiente programa Java disear un mtodo para visualizar los
elementos de un fichero de alumnos..
public static void main4tring;< args!
'
int ;< vNumeros ( '), =, >, ?, @, )), )=/*
visuali2arArra# vNumeros!*
/
public static void visuali2arArra#int ;< a!

'
0
/
public static void (ain&Strin./0 ar.s'
{
leerCicBero 8ALDENO4.DAF:!*
}
public static void leerCicBero4tring nomCicB! tBroGs E&ception
'
CileHnput4tream fis ( neG CileHnput4treamnomCicB!*
ObjectHnput4tream ois ( neG ObjectHnput4treamfis!*
LeerCicBero5ecois!*
Ois.close!*
/
public static void leerCicBero5ecObjectHnput4tream ois! tBroGs E&ception
'
Alumno alu ( Alumno! ois.readObject!*
if alu I( null!
'
leerCicBero5ecois!*
alu.mostrar!*
/
/
Ejercicio: Recursividad Mltiple
Reali,ar una funcin recursiva que calcule el t$rmino N de la serie de 5ibonacci:
1, 1! +, -, 0, 6, 1-, +1, !!! 5ibonacci(N) ' 5ibonacc (N%1) * 5ibonacc (N%+)
caso base: (N 7 +) 5ibonacci ' n
caso recursivo: (N 8' +) 5ibonacci(N)' 5ibonacci(N%1) * 5ibonacci(N%+)
public static int fibonacci int n !
'
if n , 1!
return n*
else
return fibonaccin%)! - fibonaccin%1!*
/
La secuencia de llamadas para calcular el termino J de la serie de Cibonacci sera:
-ib&+'
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-ib&=' -ib&#'
@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@
-ib&#' -ib&"' -ib&"'
-ib&!'
@@@@@@@@@@@@@@@@ @@@@@@@@@@ @@@@@@@@@@
-ib&"' -ib&!' -ib&!' -ib&' -ib&!' -ib&'
@@@@@@@@@@@@
-ib&!' -ib&'
-ib&=' Se lla(a desde el propio (Atodo ve3
-ib&#' Se lla(a desde el propio (Atodo ! veces
-ib&"' Se lla(a desde el propio (Atodo " veces
-ib&!' Se lla(a desde el propio (Atodo = veces
-ib&' Se lla(a desde el propio (Atodo " veces
Ejercicios Recursividad
"ise#ar un m$todo para calcular el n&mero combinatorio de 9m: elementos
tomados de 9n: en 9n:!
Este problema deber$is resolverlo aplicando diferentes m$todos:
1!% ;plicando la formula que hace uso del calculo del factorial
Cm! = m" # !"$m%!&"
+!% ;plicando la formula iterativa: para i de 1 a n
Cm! = 1 ' $m%1+1& div 1 ' $m%2+1& div 2' ((( '$m%i+1&div )
-!% ;plicando la le de recurrencia utili,ando la recursividad Directa Simple:
caso *ase: si ! = + Cm! = 1
caso ,e!eral: si ! - + Cm! = Cm!%1 ' $m%!+1& div !
.!% ;plicando la le de recurrencia utili,ando la recursividad Directa Mltiple
casos *ase: si ! = + Cm! = 1
si ! = m Cm! = 1
si ! - m Cm! = +
caso ,e!eral: si m - ! - + Cm! = Cm%1! + Cm%1!%1
<a llamada al subprograma Numero=ombinatorio para todos los casos podr/a ser:
public static void main4tring;< args!
'
4#stem.out.println8calculo del numero combinatorio:!*
4#stem.out.println8Hntroduce el valor de E:!*
int m ( Dtilidades.LeerEntero!*
4#stem.out.println8Hntroduce el valor de N:!*
int n ( Dtilidades.LeerEntero!*
int combinaciones ( numeroKombinatoriom, n!*
4#stem.out.print8El numero combinatorio:-m-:sobre:-n!*
4#stem.out.println8 es igual a 8-combinaciones!*
/

También podría gustarte