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.

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 Solucin %ecursiva Si X = 0 Si X > 0

X! =

$ ! $ " $ # $ $$$ $ X

X! = X! = X $ &X% '!

Solucin Iterativa public static int factorial int &! ' int fact ( )* for int i()* i,( &* i--! ' fact ( fact $ i* / return fact* /

Solucin Recursiva public static int factorial int &! ' if & (( +! return )* else return & $ factorial & . )!!* /

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 { public static int factorial int &! ' 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 : factorial i!'; } } }

)olucion !terativa:
public class Calculo,el-actorial { public static int factorial int &! ' 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 : factorial i!'; } } }

)olucion Recursiva:
public class Calculo,el-actorial { public static int factorial int &! ' 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 : factorial i!'; } } }

Ejercicio: #ise$ar un m%todo que calcule la potencia de un numero real elevado a un entero"

)olucion !terativa:
public static double potencia double base, int e&p! ' double pot ( )* for int i()* i,( e&p* i--! ' pot ( pot $ base* / return pot* /

)olucion Recursiva:
public static double potencia double base, int e&p! ' if e&p (( +! return )* else return base $ potencia base, e&p . )!!* /

Ejercicios: 1"& Escribir un m%todo que calcule la suma de los N primeros n'meros naturales"

N(5 N(5

1 + 2 + 3 + 4 + 5 = 15 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" public static int suma int n! ' if n (( +! return +* else return n - suma n . )!!* / version )

public static int suma int n! ' if n (( )! return )* else return n - suma n . )!!* /

version 1

,"& Escribir un m%todo que visualice los N primeros n'meros naturales del 1 al N" public static void visuali2a int n! ' if n 3 +! ' visuali2a n%)!* 4#stem.out.println n!* / / ."& Escribir un m%todo que visualice los N primeros n'meros naturales del N al 1" public static void visuali2a int n! ' if n 3 +! ' 4#stem.out.println n!* visuali2a n%)!* / /

/"& Escribir un m%todo que visualice los d0gitos de un n'mero natural N al rev%s N ( 7815 visuali-ar el numero 5187

public static void visuali2arDigitos5eves int n! ' if n , )+! ' 4#stem.out.println n!* / else ' 4#stem.out.print n 6 )+!* visuali2arDigitos5eves n 7 )+!* / /

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

public static void visuali2arDigitos int n! ' if n , )+! 4#stem.out.println n!* else ' int digito ( n 6 )+ * visuali2arDigitos n 7 )+!* 4#stem.out.println digito!* / / 2"& Escribir un m%todo que sirva para subra!ar un te3to" public static void subra#ar int longitud! ' if longitud 3 +! ' 4#stem.out.print 89:!* subra#ar longitud%)!* / /

Ejercicio

Recursividad en concha

Dado el siguiente programa Java disear un mtodo para sumar los elementos de un vector de enteros.

public static void main 4tring;< args! ' int ;< vNumeros ( '), =, >, ?, @, )), )=/* int suma (sumarArra# vNumeros!* 4#stem.out.println suma!* / 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 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 = sumarArra# vNumeros!* S1ste($out$println&su(a'; } public static int sumarArra# int ;< a! ' return sumarArra#5ec a, +!* / public static int sumarArra#5ec int ;< a, int pos! ' if pos (( a.lengtB! return +* else return a;pos< - sumarArra#5ec a, pos - )!* /

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 = sumarArra# vNumeros!* S1ste($out$println&su(a'; } public static int sumarArra# int ;< a! ' return sumarArra#5ec a, a.lengtB%)!* / public static int sumarArra#5ec int ;< a, int pos! ' if pos , +! return +* else return a;pos< - sumarArra#5ec a, pos % )!* /

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 = sumarArra# vNumeros!* S1ste($out$println&su(a'; } public static int sumarArra# int ;< a! ' return sumarArra#5ec a, a.lengtB%)!* / public static int sumarArra#5ec int ;< a, int pos! ' if pos (( +! return a;pos<* else return a;pos< - sumarArra#5ec a, 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 main 4tring;< 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.println a;pos<!* / /

Solucin Recursiva41

5isuali-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#5ec a, +!* / public static void visuali2arArra#5ec int ;< a, int pos! ' if pos , a.lengtB! ' 4#stem.out.println a;pos< !* visuali2arArra#5ec a, pos - )!* / /

Solucin Recursiva4,

5isuali-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#5ec a, +!* / public static void visuali2arArra#5ec int ;< a, int pos! ' if pos , a.lengtB! ' 4#stem.out.println a;pos< !* visuali2arArra#5ec a, pos - )!* / /

Solucin Recursiva4.

5isuali-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#5ec a, a.lengtB%)!* / public static void visuali2arArra#5ec int ;< a, int pos! ' if pos (( +! 4#stem.out.println a;pos< !* else ' 4#stem.out.println a;pos< !* visuali2arArra#5ec a, 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 main 4tring;< 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 leerCicBero 4tring nomCicB! tBroGs E&ception ' CileHnput4tream fis ( neG CileHnput4tream nomCicB!* ObjectHnput4tream ois ( neG ObjectHnput4tream fis!* LeerCicBero5ec ois!* Ois.close !* / public static void leerCicBero5ec ObjectHnput4tream ois! tBroGs E&ception ' Alumno alu ( Alumno! ois.readObject !* if alu I( null! ' leerCicBero5ec ois!* alu.mostrar !* / /

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&,*

public static int fibonacci int n ! ' if n , 1! return n* else return fibonacci n%)! - fibonacci n%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 -ib&#' Se lla(a desde el propio (Atodo -ib&"' Se lla(a desde el propio (Atodo -ib&!' Se lla(a desde el propio (Atodo -ib& ' Se lla(a desde el propio (Atodo

ve3 ! veces " veces = veces " 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: caso ,e!eral: si ! = + si ! - + Cm ! = 1 Cm ! = Cm !%1 ' $m%!+1& div !

/"& <plicando la le! de recurrencia utili-ando la recursividad Directa Mltiple casos *ase: caso ,e!eral: si si si si !=+ !=m !-m m-!-+ Cm ! = 1 Cm ! = 1 Cm ! = + Cm ! = Cm%1 ! + Cm%1 !%1

=a llamada al subprograma Numero>ombinatorio para todos los casos podr0a ser: public static void main 4tring;< args! ' 4#stem.out.println 8calculo del numero combinatorio:!* 4#stem.out.println 8Hntroduce el valor de E:!* int m ( Dtilidades.LeerEntero !* 4#stem.out.println 8Hntroduce el valor de N:!* int n ( Dtilidades.LeerEntero !* int combinaciones ( numeroKombinatorio m, n!* 4#stem.out.print 8El numero combinatorio:-m-:sobre:-n!* 4#stem.out.println 8 es igual a 8-combinaciones!* /

También podría gustarte