
Spanish: 
La recursividad es un concepto muy usado en
matemáticas y en programación, en el que
para definir algo, como puede ser una función
o un proceso, dentro del cuerpo de esa definición
va, la propia cosa definida.
El ejemplo más básico es el caso de los
factoriales.
El factorial de un número N equivale a multiplicar
todos los números enteros entre 1 y N.
Por ejemplo, 5!
= 1 * 2 * 3 * 4 * 5.
Sin embargo, esto se puede definir de forma
recursiva simplemente diciendo que 5!
= 5 * 4!.
El factorial es uno de los ejemplos que se
pone en la mayoría de los casos para explicar
la recursividad porque es la forma más sencilla
de explicarlo, pero ni mucho menos es la única.
Cuando uno construye funciones recursivas,
es importante establecer un caso base, en
el que no necesitemos recurrir de nuevo.
Esto es importante ya que si nuestra función
se recurre infinitamente, no tendrá solución.
Por ejemplo, si quieres usar recursividad
para calcular un factorial deberás establecer
un caso en el que puedas dar el factorial
sin recurrir.
Por ejemplo, el factorial de 0 es 1.
Sin embargo, hay más problemas que se pueden
beneficiar de la recursividad, y uno de esos,
es el de las torres de Hanoi.

Spanish: 
La recursividad es un concepto muy usado en
matemáticas y en programación, en el que
para definir algo, como puede ser una función
o un proceso, dentro del cuerpo de esa definición
va, la propia cosa definida.
El ejemplo más básico es el caso de los
factoriales. El factorial de un número N
equivale a multiplicar todos los números
enteros entre 1 y N. Por ejemplo, 5! = 1 * 2
* 3 * 4 * 5. Sin embargo, esto se puede definir
de forma recursiva simplemente diciendo que
5! = 5 * 4!. El factorial es uno de los ejemplos
que se pone en la mayoría de los casos para
explicar la recursividad porque es la forma
más sencilla de explicarlo, pero ni mucho
menos es la única.
Cuando uno construye funciones recursivas,
es importante establecer un caso base, en
el que no necesitemos recurrir de nuevo. Esto
es importante ya que si nuestra función se
recurre infinitamente, no tendrá solución.
Por ejemplo, si quieres usar recursividad
para calcular un factorial deberás establecer
un caso en el que puedas dar el factorial
sin recurrir. Por ejemplo, el factorial de
0 es 1.
Sin embargo, hay más problemas que se pueden
beneficiar de la recursividad, y uno de esos,

Spanish: 
es el de las torres de Hanoi. En esencia,
en el problema de las torres de Hanoi tenemos
tres torres donde hay discos apilados. En
un momento inicial tenemos una torre con los
discos apilados en forma de pirámide: cada
disco es más pequeño que el disco que hay
debajo. En este problema de lógica, tenemos
que pasar la pirámide de la primera de las
torres a la tercera, recordando un par de
reglas clave:
Tiene que quedarnos otra pirámide, por lo
que la torre final también tiene que estar
ordenada de la más pequeña a la más grande.
Sólo podemos mover un disco a la vez.
Un disco no puede descansar sobre otro que
sea más pequeño que él.
Si nunca te has enfrentado a este problema
en Internet existen multitud de páginas web
donde puedes jugar online a este problema
de lógica. En la descripción he dejado algunas,
simplemente abre una y prueba a ordenar los
discos por tu cuenta. Si no estás acostumbrado
a este problema, lo más normal es que al
principio te atasques en un paso y no sepas
continuar.
Afortunadamente, existe una forma fácil de
resolver este problema y es con recursivdad.
El truco está en dividir un problema gordo
como puede ser mover discos de una torre a
otra, en un problema más sencillo.
Si tienes que mover una pirámide de N discos
de una torre a la otra, lo mejor que puedes
hacer es lo siguiente:

Spanish: 
En esencia, en el problema de las torres de
Hanoi tenemos tres torres donde hay discos
apilados.
En un momento inicial tenemos una torre con
los discos apilados en forma de pirámide:
cada disco es más pequeño que el disco que
hay debajo.
En este problema de lógica, tenemos que pasar
la pirámide de la primera de las torres a
la tercera, recordando un par de reglas clave:
Tiene que quedarnos otra pirámide, por lo
que la torre final también tiene que estar
ordenada de la más pequeña a la más grande.
Sólo podemos mover un disco a la vez.
Un disco no puede descansar sobre otro que
sea más pequeño que él.
Si nunca te has enfrentado a este problema
en Internet existen multitud de páginas web
donde puedes jugar online a este problema
de lógica.
En la descripción he dejado algunas, simplemente
abre una y prueba a ordenar los discos por
tu cuenta.
Si no estás acostumbrado a este problema,
lo más normal es que al principio te atasques
en un paso y no sepas continuar.
Afortunadamente, existe una forma fácil de
resolver este problema y es con recursivdad.
El truco está en dividir un problema gordo
como puede ser mover discos de una torre a
otra, en un problema más sencillo.
Si tienes que mover una pirámide de N discos
de una torre a la otra, lo mejor que puedes
hacer es lo siguiente:

Spanish: 
Mover en uno o varios pasos los primeros N-1
discos a la torre del medio, que es la auxiliar.
Mover el disco de abajo a la tercera torre.
Mover en uno o varios pasos los discos que
tenemos en la torre del medio a la torre de
la derecha.
Y con esto ya nos hemos sacado de la manga
un problema recursivo porque con esto hemos
conseguido que para mover discos de una torre
a otra, uno de los pasos sea, mover discos
de una torre a la otra. En todos los casos
tendremos una torre origen, una torre destino,
y una torre que usaremos como auxiliar para
ayudarnos a mover discos de una torre a la
otra.
Obviamente si queremos formular el problema
recursivo en condiciones, tenemos que definir
un caso base que no dependa de la recursividad.
Y ese caso es, cuando nuestra torre de origen
sólo tiene un disco. Si sólo tiene un disco
no necesitas operaciones intermedias, te basta
con mover tu único disco de la torre inicial
a la torre final. Y, boom, problema resuelto.
Ahora viene la pregunta del millón: cómo
escribimos esto en código. Lo más sencillo
sería representar cada disco con un número
entre 1 y N, donde los números más altos
representan los discos más grandes. Lo apropiado
será representar las torres como pilas donde
introduces enteros, ya que al fin y al cabo
en una pila, al igual que en una torre, sólo

Spanish: 
Mover en uno o varios pasos los primeros N-1
discos a la torre del medio, que es la auxiliar.
Mover el disco de abajo a la tercera torre.
Mover en uno o varios pasos los discos que
tenemos en la torre del medio a la torre de
la derecha.
Y con esto ya nos hemos sacado de la manga
un problema recursivo porque con esto hemos
conseguido que para mover discos de una torre
a otra, uno de los pasos sea, mover discos
de una torre a la otra.
En todos los casos tendremos una torre origen,
una torre destino, y una torre que usaremos
como auxiliar para ayudarnos a mover discos
de una torre a la otra.
Obviamente si queremos formular el problema
recursivo en condiciones, tenemos que definir
un caso base que no dependa de la recursividad.
Y ese caso es, cuando nuestra torre de origen
sólo tiene un disco.
Si sólo tiene un disco no necesitas operaciones
intermedias, te basta con mover tu único
disco de la torre inicial a la torre final.
Y, boom, problema resuelto.
Ahora viene la pregunta del millón: cómo
escribimos esto en código.
Lo más sencillo sería representar cada disco
con un número entre 1 y N, donde los números
más altos representan los discos más grandes.
Lo apropiado será representar las torres
como pilas donde introduces enteros, ya que
al fin y al cabo en una pila, al igual que
en una torre, sólo puedes meter y sacar elementos
de la cima.

Spanish: 
puedes meter y sacar elementos de la cima.
Si no conoces cómo funcionan las pilas, también
puedes usar un array donde con un índice
apuntes al último elemento introducido, para
saber por donde introducir y sacar nuevos
elementos.
El pseudocódigo general para este algoritmo
podría ser una función llamada Hanoi, a
la que le indiquemos cuántos discos tiene
nuestra torre, ya que si no el algoritmo no
sabrá cuándo ha llegado al último disco
de la torre y cuáles son las torres origen,
auxiliar y destino. El algoritmo se comportará
así:
Si sólo tenemos que mover un disco:
Mueve directamente el único disco de la torre
origen a la torre destino.
En cambio, si tenemos más de un disco:
Mueve los primeros N-1 discos de la torre
origen a la torre auxiliar.
Mueve el disco que queda en la torre origen
a la torre destino.
Mueve los N-1 discos que hay en la torre auxiliar
a la torre destino.
Convertido a pseudocódigo,:
Hanoi(n, origen, auxiliar, destino) {
if (n == 1) {
destino.meter (origen.sacar())
} else {
Hanoi(n - 1, origen, destino, auxiliar)
destino.meter(origen.sacar())
Hanoi(n - 1, auxiliar, origen, destino)
}
Para saber cuántos pasos deben correrse como
mínimo para poder desplazar N discos, podemos
usar un modelo inductivo.
Para mover 1 disco necesitamos 1 paso.
Para mover dos discos, necesitamos: 1 paso
para mover un disco a la segunda torre, el

Spanish: 
Si no conoces cómo funcionan las pilas, también
puedes usar un array donde con un índice
apuntes al último elemento introducido, para
saber por donde introducir y sacar nuevos
elementos.
El pseudocódigo general para este algoritmo
podría ser una función llamada Hanoi, a
la que le indiquemos cuántos discos tiene
nuestra torre, ya que si no el algoritmo no
sabrá cuándo ha llegado al último disco
de la torre y cuáles son las torres origen,
auxiliar y destino.
El algoritmo se comportará así:
Si sólo tenemos que mover un disco:
Mueve directamente el único disco de la torre
origen a la torre destino.
En cambio, si tenemos más de un disco:
Mueve los primeros N-1 discos de la torre
origen a la torre auxiliar.
Mueve el disco que queda en la torre origen
a la torre destino.
Mueve los N-1 discos que hay en la torre auxiliar
a la torre destino.
Convertido a pseudocódigo,:
Hanoi(n, origen, auxiliar, destino) {
if (n == 1) {
destino.meter (origen.sacar())
} else {
Hanoi(n - 1, origen, destino, auxiliar)
destino.meter(origen.sacar())
Hanoi(n - 1, auxiliar, origen, destino)
}
Para saber cuántos pasos deben correrse como
mínimo para poder desplazar N discos, podemos
usar un modelo inductivo.
Para mover 1 disco necesitamos 1 paso.
Para mover dos discos, necesitamos: 1 paso
para mover un disco a la segunda torre, el

Spanish: 
paso de mover el disco, y otro paso para mover
el disco a la tercera torre.
En total, 3 pasos.
Para mover 3 discos, necesitamos los 3 pasos
para mover 2 discos, el paso intermedio, y
otros tres pasos, es decir, 7.
Para mover 4 discos, serán 7 pasos, más
un paso, más otros 7 pasos, en total 15.
Viendo todas estas fórmulas podemos inducir
que el número de pasos para mover N discos
es siempre 2^N - 1.
Por ejemplo, para mover 7 discos, serán necesarios
2^7 - 1 pasos, es decir, 127.
Como reseña histórica, la leyenda cuenta
que en un templo indio un rey mandó instalar
64 discos de oro y les dio estas instrucciones
a los monjes para que manipulasen los discos.
La leyenda cuenta que cuando el último disco
fuese colocado en la tercera torre, el fin
del mundo llegaría.
¿Preocupado?
No deberías.
Recordemos por la fórmula, que para mover
64 discos será necesario hacer 2^64-1 movimientos.
2^64-1 es un número grotescamente grande,
e incluso si los monjes fuesen capaces de

Spanish: 
paso de mover el disco, y otro paso para mover
el disco a la tercera torre. En total, 3 pasos.
Para mover 3 discos, necesitamos los 3 pasos
para mover 2 discos, el paso intermedio, y
otros tres pasos, es decir, 7.
Para mover 4 discos, serán 7 pasos, más
un paso, más otros 7 pasos, en total 15.
Viendo todas estas fórmulas podemos inducir
que el número de pasos para mover N discos
es siempre 2^N - 1. Por ejemplo, para mover
7 discos, serán necesarios 2^7 - 1 pasos,
es decir, 127.
Como reseña histórica, la leyenda cuenta
que en un templo indio un rey mandó instalar
64 discos de oro y les dio estas instrucciones
a los monjes para que manipulasen los discos.
La leyenda cuenta que cuando el último disco
fuese colocado en la tercera torre, el fin
del mundo llegaría.
¿Preocupado? No deberías. Recordemos por
la fórmula, que para mover 64 discos será
necesario hacer 2^64-1 movimientos. 2^64-1
es un número grotescamente grande, e incluso

Spanish: 
si los monjes fuesen capaces de hacer un movimiento
cada segundo, necesitarían casi 585.000 millones
de años.
¿Y por qué se les llama torres de Hanoi
si la leyenda está basada en la India? Bueno,
eso es porque la leyenda ha sido escrita cambiando
cosas muchas veces, desde quién ordenó instalar
los discos, hasta dónde estaba el templo.
Y según una de las leyendas, el templo estaba
situado en Hanoi, en la capital de Vietnam.

Spanish: 
hacer un movimiento cada segundo, necesitarían
casi 585.000 millones de años.
¿Y por qué se les llama torres de Hanoi
si la leyenda está basada en la India?
Bueno, eso es porque la leyenda ha sido escrita
cambiando cosas muchas veces, desde quién
ordenó instalar los discos, hasta dónde
estaba el templo.
Y según una de las leyendas, el templo estaba
situado en Hanoi, en la capital de Vietnam.
