Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Recursividad
Recursividad
2.1.- Introduccin.
La recursividad consiste en realizar una definicin de un
concepto en trminos del propio concepto que se est definiendo.
Ejemplos:
O lo que es lo mismo:
2! = 2 * 1!
1! = 1 * 0!
0! = 1
1! = 1 * 0! = 1
2! = 2 * 1! = 2
3! = 3 * 2! = 6
4! = 4 * 3! = 24
RESOLUCIN DE
PROBLEMAS MS
COMPLEJOS A PARTIR
DE OTROS MS
SIMPLES
5! = 5 * 4! = 120
Algoritmos recursivos:
diseo de la solucin de un problema de manera recursiva
Algoritmo recursivo
Implementacin en un lenguaje de alto
nivel que permita recursividad (en nuestro caso, en Java).
El caso base
10.Acta como condicin de finalizacin de la funcin
recursiva. Sin el caso base la rutina recursiva se llamara
indefinidamente y no finalizara nunca.
11.Es el cimiento sobre el cual se construir la solucin
completa al problema.
Ejemplo: Traza del factorial de 5.
[P4] Cmo se usa la solucin del caso base para construir una
solucin correcta al problema original?
int fibonacci(int n)
{
if ((n == 1) || (n == 2)) return 1;
else return (fibonacci(n-2) + fibonacci(n-1));
}
Parmetros:
el tamao del vector (n),
el propio vector (vector),
el valor a buscar (objetivo) y
el ndice del primer elemento del vector a procesar
(primero).
1));
else
return(contarOcurrencias(n,vector,
primero+1));
}
}
objetivo,
Respuestas:
[P1] El clculo del nmero de combinaciones de n
elementos tomados de k en k se puede descomponer en
dos problemas:
a) calcular el nmero de combinaciones de n-1
elementos tomados de k en k y
b) el nmero de combinaciones de n-1 elementos
tomados de k-1 en k-1.
El resultado del problema inicial:
ncsr(n, k) = ncsr(n- 1, k-1) + ncsr(n-1, k).
Solucin final: 3 + 3 = 6
Soluciones:
1. Declarar algunas variables como globales.
2. Hacer pasos por referencia.
3. Crear una funcin y dentro de ella implementar la
funcin recursiva (la primera recubrir a la
segunda).
if (n==1)
System.out.println(Moviendo
en+de+al+hacia);
}
! !
""#
$% &
$% &
'
'
()
! !
$$
'
'
&
""#
$% &
Solucin:
Para un disco: moverlo de A a B.
Para ms de un disco:
Solventar el problema para n-1 discos, ignorando el
ltimo de ellos, pero ahora teniendo en cuenta que el
poste destino ser C y B ser el auxiliar
Una vez hecho esto anterior, los n - 1 discos estarn en
C y el ms grande permanecer en A. Por tanto,
tendramos el problema cuando n = 1, en cuyo caso se
movera ese disco de A a B
Por ltimo, nos queda mover los n-1 discos de C a B,
utilizando A como poste auxiliar.
public void torresHanoi(int numDiscos, char origen,
char destino, char auxiliar)
{
if (numDiscos == 1)
Sytem.out.println("Mover el disco de arriba del
poste+ origen+al + destino);
else
{
torresHanoi(numDiscos-1,
origen,
auxiliar,
destino);
torresHanoi(1, origen, destino, auxiliar);
torresHanoi(numDiscos-1,
auxiliar,
destino,
origen);
}
}
2.7.2.- Backtracking.
Ejemplo: el problema de las ocho reinas
R
R
R
R
R
R
R
R
Solucin:
Meter la primera reina.
Meter la segunda en una casilla que no est atacada por
la primera reina.
Meter la tercera en una casilla no atacada por la
primera o la segunda.
Meter sucesivamente el resto de reinas. Si en algn
momento no puede colocarse una reina, ir deshaciendo
movimientos de las reinas ya colocadas y a partir de esa
reorganizacin continuar la colocacin del resto de
reinas.
Funciones auxiliares:
void asignarReinaA(int fila, int columa) => Sita un 1
en la casilla (Fila, Columna) indicando que est
ocupada por una reina.
void eliminarReinaDe(int fila, int columna) => Sita un
0 en la casilla (Fila, Columna) indicando que esa casilla
est libre (antes estaba ocupada por una reina y ahora
deja de estarlo).
int recibeJaqueEn(int fila, int columna) => Devuelve 1
si la casilla (Fila, Columna) recibe jaque de alguna
reina y 0 en caso contrario.