Está en la página 1de 21

http://es.scribd.

com/doc/17801269/42/Recursivida
d-vs-Iteracion
Recursividad
La recursividad consiste en de!inir una entidad en funcin de si misma
"n pro#ramaci$n %a recursividad nos da %a posibi%idad de
de!inir un tipo de datos en !unci$n de si mismo& o bien nos
permite de!inir un problema en !unci$n de si mismo.
Recursividad de Definicin : ap%icada a "structuras de 'atos
(osibi%idad de de!inir un tipo de datos en t)rminos de si mismo.
public class *odo {
protected +b,ect elemento;
protected *odo siguiente;
pub%ic *odo-.
/* Crea un nuevo objeto nodo */
{ }
...
}
Recursividad de Ejecucin : ap%icada a %os prob%emas
(osibi%idad de de!inir un prob%ema en !unci$n de% propio prob%ema.
Recursividad de Ejecucin o Recursividad Funcional
"s a/ue%%a /ue se ap%icada a %a so%uci$n de %os prob%emas 0
define el problema en funcin del propio problema& %o cua%
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.
n e!emplo 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! = 1 ! 1 " 1 # 1 $$$ 1 X
Solucin %ecursiva Si X = 0 X! =
Si X > 0 X! = X 1 &X-'!
Solucin Iterativa Solucin Recursiva
pub%ic static int !actoria%-int 2. pub%ic static int !actoria%-int 2.
3 3
int !act 4 15 i! -2 44 0.
!or -int i415 i64 25 i77. return 15
3 e%se
!act 4 !act 1 i5 return -2 1 !actoria%-2 8 1..5
9 9
return !act5
9
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 ma!or de cero"
Ejemplo de una ejecucin:
Introduce un nu(ero) *#
Introduce un nu(ero) 0
Introduce un nu(ero) #
! =
!! = * ! = !
"! = * ! * " = +
#! = * ! * " * # = !#
public class Calculo,el-actorial
{
pub%ic static int !actoria%-int 2.
3
:
9
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 : !actoria%-i.';
}
}
}
)olucion !terativa:
public class Calculo,el-actorial
{
pub%ic static int !actoria%-int 2.
3
int !act 4 15
!or -int i415 i64 25 i77.
3
!act 4 !act 1 i5
9
return !act5
9
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 : !actoria%-i.';
}
}
}
)olucion Recursiva:
public class Calculo,el-actorial
{
pub%ic static int !actoria%-int 2.
3
i! -2 44 0.
return 15
e%se
return -2 1 !actoria%-2 8 1..5
9
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 : !actoria%-i.';
}
}
}
Ejercicio:
#ise$ar un m%todo que calcule la potencia de un numero real elevado a
un entero"
)olucion !terativa:
pub%ic static doub%e potencia-doub%e base& int e2p.
3
doub%e pot 4 15
!or -int i415 i64 e2p5 i77.
3
pot 4 pot 1 base5
9
return pot5
9
)olucion Recursiva:
pub%ic static doub%e potencia-doub%e base& int e2p.
3
i! -e2p 44 0.
return 15
e%se
return -base 1 potencia-base& e2p 8 1..5
9
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 d0gitos de un n'mero natural N al rev%s
N ( 7815 visuali-ar el numero 5187
1"& Escribir un m%todo que visualice los d0gitos de un n'mero natural N uno por l0nea"
N ( 7815 visuali-ar el numero 7
8
1
5
2"& Escribir un m%todo que sirva para subra!ar un te3to"
Ejercicios:
1"& Escribir un m%todo que calcule la suma de los N primeros n'meros naturales"
pub%ic static int suma-int n. version 1
3
i! -n 44 0.
return 05
e%se
return -n 7 suma-n 8 1..5
9
pub%ic static int suma-int n. version 2
3
i! -n 44 1.
return 15
e%se
return -n 7 suma-n 8 1..5
9
,"& Escribir un m%todo que visualice los N primeros n'meros naturales del 1 al N"
pub%ic static void visua%i;a-int n.
3
i! -n < 0.
3
visua%i;a-n-1.5
=0stem.out.print%n-n.5
9
9
."& Escribir un m%todo que visualice los N primeros n'meros naturales del N al 1"
pub%ic static void visua%i;a-int n.
3
i! -n < 0.
3
=0stem.out.print%n-n.5
visua%i;a-n-1.5
9
9
/"& Escribir un m%todo que visualice los d0gitos de un n'mero natural N al rev%s
N ( 7815 visuali-ar el numero 5187
pub%ic static void visua%i;ar'i#itosReves-int n.
3
i! -n 6 10.
3
=0stem.out.print%n-n.5
9
e%se
3
=0stem.out.print-n > 10.5
visua%i;ar'i#itosReves-n / 10.5
9
9
1"& Escribir un m%todo que visualice los d0gitos de un n'mero natural N uno por linea"
N ( 7815 visuali-ar el numero 7
8
1
5
pub%ic static void visua%i;ar'i#itos-int n. 3
i! -n 6 10.
=0stem.out.print%n-n.5
e%se
3
int di#ito 4 n > 10 5
visua%i;ar'i#itos-n / 10.5
=0stem.out.print%n-di#ito.5
9
9
2"& Escribir un m%todo que sirva para subra!ar un te3to"
pub%ic static void subra0ar-int %on#itud. 3
i! -%on#itud < 0. 3
=0stem.out.print-?@A.5
subra0ar-%on#itud-1.5
9
9
Ejercicio Recursividad en concha

Dado el siguiente programa Java disear un mtodo para sumar los elementos
de un vector de enteros.
pub%ic static void main-=trin#BC ar#s.
3
int BC v*umeros 4 31& D& E& 7& 9& 11& 1D95
int suma 4sumarFrra0- v*umeros.5
=0stem.out.print%n-suma.5
9
pub%ic static int sumarFrra0-int BC a.

3
:
9
Solucion Iterativa
public static void (ain&Strin./0 ar.s'
{
int /0 v;u(eros = {< "< =< >< ?< < "};
int su(a = sumarFrra0- v*umeros.5
S1ste($out$println&su(a';
}
pub%ic static int sumarFrra0-int BC a.

3
int acumu%ador 4 05
!or -int pos405 pos 6 a.%en#th5 pos77.
3
acumu%ador 4 acumu%ador 7 aBposC5
9
return acumu%ador5
9
Solucion Recursiva 41 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 = sumarFrra0- v*umeros.5
S1ste($out$println&su(a';
}
pub%ic static int sumarFrra0-int BC a.
3
return sumarFrra0Rec-a& 0.5
9
pub%ic static int sumarFrra0Rec-int BC a& int pos.
3
i! -pos 44 a.%en#th.
return 05
e%se
return aBposC 7 sumarFrra0Rec-a& pos 7 1.5
9
Solucion Recursiva4, 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 = sumarFrra0- v*umeros.5
S1ste($out$println&su(a';
}
pub%ic static int sumarFrra0-int BC a.
3
return sumarFrra0Rec-a& a.%en#th-1.5
9
pub%ic static int sumarFrra0Rec-int BC a& int pos.
3
i! -pos 6 0.
return 05
e%se
return aBposC 7 sumarFrra0Rec-a& pos - 1.5
9
Solucion Recursiva4. 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 = sumarFrra0- v*umeros.5
S1ste($out$println&su(a';
}
pub%ic static int sumarFrra0-int BC a.
3
return sumarFrra0Rec-a& a.%en#th-1.5
9
pub%ic static int sumarFrra0Rec-int BC a& int pos.
3
i! -pos 44 0.
return aBposC5
e%se
return aBposC 7 sumarFrra0Rec-a& pos - 1.5
9
Ejercicio Recursividad en concha
Dado el siguiente programa Java disear un mtodo para visualizar los
elementos de un vector de enteros.
pub%ic static void main-=trin#BC ar#s.
3
int BC v*umeros 4 31& D& E& 7& 9& 11& 1D95
visua%i;arFrra0- v*umeros.5
9
pub%ic static void visua%i;arFrra0-int BC a.

3
:
9
Solucin Iterativa
public static void (ain&Strin./0 ar.s'
{
int /0 v;u(eros = {< "< =< >< ?< < "};
visua%i;arFrra0- v*umeros.5
}
pub%ic static void visua%i;arFrra0-int BC a.
3
!or -int pos405 pos 6 a.%en#th5 pos77.
3
=0stem.out.print%n-aBposC.5
9
9
Solucin Recursiva41 5isuali-a los elementos del principio hacia el final
public static void (ain&Strin./0 ar.s'
{
int /0 v;u(eros = {< "< =< >< ?< < "};
visua%i;arFrra0- v*umeros.5
}
pub%ic static void visua%i;arFrra0-int BC a.
3
visua%i;arFrra0Rec-a& 0.5
9
pub%ic static void visua%i;arFrra0Rec-int BC a& int pos.
3
i! -pos 6 a.%en#th.
3
=0stem.out.print%n- aBposC .5
visua%i;arFrra0Rec-a& pos 7 1.5
9
9
Solucin Recursiva4, 5isuali-a los elementos del principio hacia el final
public static void (ain&Strin./0 ar.s'
{
int /0 v;u(eros = {< "< =< >< ?< < "};
visua%i;arFrra0- v*umeros.5
}
pub%ic static void visua%i;arFrra0-int BC a.
3
visua%i;arFrra0Rec-a& 0.5
9
pub%ic static void visua%i;arFrra0Rec-int BC a& int pos.
3
i! -pos 6 a.%en#th.
3
=0stem.out.print%n- aBposC .5
visua%i;arFrra0Rec-a& pos 7 1.5
9
9
Solucin Recursiva4. 5isuali-a los elementos del final hacia el principio
public static void (ain&Strin./0 ar.s'
{
int /0 v;u(eros = {< "< =< >< ?< < "};
visua%i;arFrra0- v*umeros.5
}
pub%ic static void visua%i;arFrra0-int BC a.
3
visua%i;arFrra0Rec-a& a.%en#th-1.5
9
pub%ic static void visua%i;arFrra0Rec-int BC a& int pos.
3
i! -pos 44 0.
=0stem.out.print%n- aBposC .5
e%se
3
=0stem.out.print%n- aBposC .5
visua%i;arFrra0Rec-a& pos - 1.5
9
9
Ejercicio Recursividad en concha
Dado el siguiente programa Java disear un mtodo para visualizar los
elementos de un fichero de alumnos..
pub%ic static void main-=trin#BC ar#s.
3
int BC v*umeros 4 31& D& E& 7& 9& 11& 1D95
visua%i;arFrra0- v*umeros.5
9
pub%ic static void visua%i;arFrra0-int BC a.

3
:
9
public static void (ain&Strin./0 ar.s'
{
%eerGichero- ?FLHI*+=.'FJA.5
}
pub%ic static void %eerGichero-=trin# nomGich. throKs "2ception
3
Gi%eInput=tream !is 4 neK Gi%eInput=tream-nomGich.5
+b,ectInput=tream ois 4 neK +b,ectInput=tream-!is.5
LeerGicheroRec-ois.5
+is.c%ose-.5
9
pub%ic static void %eerGicheroRec-+b,ectInput=tream ois. throKs "2ception
3
F%umno a%u 4 -F%umno. ois.read+b,ect-.5
i! -a%u L4 nu%%.
3
%eerGicheroRec-ois.5
a%u.mostrar-.5
9
9
Ejercicio: Recursividad Mltiple
Reali-ar una funcin recursiva que calcule el t%rmino N de la serie de 6ibonacci:
1 1" , . 1 7 1. ,1 """ 6ibonacci)N* ( 6ibonacc )N&1* + 6ibonacc )N&,*
caso base: )N 8 ,* 6ibonacci ( n
caso recursivo: )N 9( ,* 6ibonacci)N*( 6ibonacci)N&1* + 6ibonacci)N&,*
pub%ic static int !ibonacci- int n .
3
i! -n 6 2.
return n5
e%se
return !ibonacci-n-1. 7 !ibonacci-n-2.5
9
La secuencia de %%amadas para ca%cu%ar e% termino 6 de %a serie de Gibonacci 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 :m; elementos
tomados de :n; en :n;"
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 podr0a ser:
pub%ic static void main-=trin#BC ar#s.
3
=0stem.out.print%n-?ca%cu%o de% numero combinatorioA.5
=0stem.out.print%n-?Introduce e% va%or de IA.5
int m 4 Hti%idades.Leer"ntero-.5
=0stem.out.print%n-?Introduce e% va%or de *A.5
int n 4 Hti%idades.Leer"ntero-.5
int combinaciones 4 numeroMombinatorio-m& n.5
=0stem.out.print-?"% numero combinatorioA7m7AsobreA7n.5
=0stem.out.print%n-? es i#ua% a ?7combinaciones.5
9

También podría gustarte