Entendiendo la recursividad con las Torres de Hanoi
ฝัง
- เผยแพร่เมื่อ 5 ก.ย. 2024
- Las Torres de Hanoi es un juego de lógica donde tenemos tres torres y tenemos que mover los discos que hay en la primera torre a la tercera, siguiendo siempre algunas reglas, como que sólo podemos mover los discos de uno en uno o que no podemos poner un disco sobre otro más pequeño que él.
► Recursividad: • Entendiendo la recursi...
► Juega a las Torres de Hanoi: www.geogebra.o...
🔔 ¡Suscríbete ya! th-cam.com/users/ma...
➕ Más tutoriales en: www.makigas.es
⭐ Programa de miembros: youtube.com/@m...
📝 Foros de la comunidad: foro.makigas.es
💬 Servidor de Discord: discord.makiga...
Vine buscando cómo construir mi propia función _printf (aún no tengo npi de por dónde empezar) y me hiciste recordar mi infancia en un museo interactivo para niños donde había unas torres de hannoi gigantes con discos de goma, entretenido estuve más de 1 hora tratando de resolver el problema, iba con una de mis tías master en informática y dijo: "este niño va a ser un buen ingeniero" y bueno aquí estamos tratando de serlo 😅
Después de buscar un rato por internet, este video me ha iluminado en pocos segundos. Gracias
►► Las torres de Hanoi
Cuenta la leyenda que cuando los 64 discos de oro pasen de una torre a la otra, llegará el fin del mundo. Leyenda o no, en este vídeo cuento cómo se puede expresar de forma recursiva el algoritmo de las Torres de Hanoi. Código próximamente.
► Vídeo: th-cam.com/video/lilBGvaOSy8/w-d-xo.html
me encanta que tu comentario sea recursivo. Le hago click y vuelvo a tener el mismo comentario con el mismo enlace.
creo que te has equivocado en el pseudocodigo, porque según te entendí, las pilas son 3 , donde las llamas o,d,a así que deducí que a=auxiliar, d=destino y o=origen. Ahora bien, dónde creo que has metido la gamba, cuando vas a explicar el caso base, pones a.apilar(o.desapilar()) cuando en realidad creo que querrías decir d.apilar(o.desapilar())
Un cordial saludo y muchas gracias por toda la explicación, me ayudó mucho!!!
Una explicación corta, clara, concisa y divertida. Es divertido ver y oír una explicación con el chiste de los memes, se hace muy ameno y la historia final de por qué se llama Torre de Hanoi, cuanto menos resulta interesante de saber.
Lo has explicado súper sencillo y entendible! Amé el vídeo
Excelente video, entendí a nivel teórico cómo se resuelve el ejercicio. Muchas gracias ^^
Muchisimas gracias! No pensé que de verdad lo ibas a publicar tan rápido! Hahahah en serio gracias! Saludos!
¿Para que necesitabas asimilar este concepto?
Daniel Chísica fue ya hace tiempo, una... para entender la recursivisad y otra, porque mi maestro de programación me pidió desarrollar este algoritmo
Te puedo pedir algunos consejos en base a tu experiencia, es que este semestre comienzo la asignatura de Programación Avanzada
claro! yadyguitar@yahoo.es
Muy buen video, me ha grada la forma como explicas y las notas graciosas que pones.
No me queda muy claro, si A es auxiliar, ¿por qué el texto dice que hay que poner en A y la voz dice "poner en Destino"?
muy bien,me sirvio mucho a resolver mi tarea
No sabía que ibai daba clases de programación
GRACIASS, toma tu merecido like y me suscribo
Respira un poco, algunos no procesamos tan rápido
ami me parece bien explicado gracias :)
Muy buena explicación crack❤
buen doble tempo , ya debes ir a batallar en la redbull sobrado le ganas a khan
Muy interesante y explicativo. Like
Propongo una solución simple, simple y sobre todo mnemotécnica. La regla es la siguiente:
- en un movimiento mueva el disco más pequeño, de forma circular (apuestas: a -> b
-> c -> b, -> a, etc.),
- en el siguiente, debe realizar la única operación posible,
- en el siguiente movimiento, mueva el disco más pequeño nuevamente de forma circular,
- en el siguiente movimiento, se ve obligado a realizar la única operación posible y así
sucesivamente, hasta que todos los discos hayan sido traídos de la estaca
"a" a la estaca de destino final "c". Esta regla también
corrige el primer movimiento para discos impares, ya que el
primer movimiento del disco más pequeño se repite desde a -> b y desde b -> c.
Espero haber sido claro, gracias y disfruten.
Espera espera espera. También enseñas matemáticas?
Esto se ha puesto más interesante de lo que creía
Gracias es justo la explicación del algoritmo que necesitaba
Aprendi mas historia :'vv
Alguien puede explicarme en qué caso práctico uno programaría usando recursividad??
en un metodo iterativo es más optimo que el uso de ciclos que tienen los lenguajes de programacion por defecto
La recursividad se utiliza cuando uno no sabe el nº de capas que tiene que recorrer el algoritmo.
Un ejemplo muy sencillo es contar los elementos de una estructura fractal irregular, como podría ser un árbol o la estructura de un disco duro (hojas - ficheros, ramas - carpetas, subramas - subcarpetas).
Imaginemos que tú quisieras contar el nº de hojas de cualquier arbol del mundo, y de entrada tú no vas a saber cuántas ramas/sub-ramas tiene cada árbol, sólo sabes que todos tienen un tronco; podrías hacer algo tal como:
resultado = Funcion_Contar_Hojas(tronco) // 1ª llamada
Funcion_Contar_Hojas(rama)
{
resultado = 0
foreach (hoja in rama)
{
resultado = resultado + 1
}
foreach (subrama in rama)
{
resultado = resultado + Funcion_Contar_Hojas(subrama) // recursividad.
}
return (resultado)
}
En aquellos problemas en los que de entrada tú sabes el nº de bifurcaciones (como en Hanoi, que siempre son 3 torres, o en factoriales, que es una única torre "de bajada"), la recursividad no es la mejor solución para programar por el alto consumo de recursos, en su lugar se utiliza (o debería utilizar) la iteración. Sin embargo, a pesar de que en programación en el mundo real son dos ejemplos en los que la recursividad sería considerada una "mala praxis", son ejemplos que ayudan a entender el concepto de forma muy sencilla.
pseudo-código para el problema del factorial en iteración
Funcion_Factorial(numero) // se va a presuponer que el parámetro "numero" siempre va a ser un nº natural (es decir, entero y positivo)
{
resultado = 1
while (numero > 1)
{
resultado = resultado * numero
numero = numero - 1
}
return (resultado)
}
@@AndreuPinel genial! Muchas gracias por la explicación muy completa
Genial vídeo. Gracias.
Los memes son lo mejor jajaja.
Quién diría que ibai explicara temas de programación, un abrazo maquina!
Muy bueno el video me ayudó de mucho
Interesante solucion
Bastante Interesante !! =)
Me habeis salvado el culo tio,este video es la mera hostia
Graciaas !
una duda, en el pseudocódigo dice que si n=1 se debe de mover de O a A; A es el destino, cierto? buen vídeo, por cierto. :)
+Axel Cervantes No, el destino es D. A es Auxiliar. Veo en el subtitulado que no lo menciono. Debería poner alguna nota cuando pueda para que no quede duda.
@@makigas El caso es que aunque por voz lo explicas bien, en la imagen está mal dado que aparece A y no D, tanto en el "if" como en el "else" (revisa el tramo del vídeo de 3:15 a 3:35 porque en ambas partes de la condición, el movimiento de un único disco es errónea, también en la traducción a pseudo-código). Además, ya como puntilla, añado que la condición la has diseñado como "if (n=1) { a } else { b }", lo cuál entraría en una recursividad incontrolada si en la primera llamada n=0 (o negativo, aunque no tenga sentido). En su lugar yo cambiaría la condición por "if (n>1) { b } else { a }" (se sobreentiende que los métodos apilar/desapilar tienen controlado la casuística de que no haya discos en la torre origen; aunque en cualquier caso no entraría en una recursividad infinita, algo que siempre es peor que un error incontrolado).
En realidad la mejor solución para mí siempre ha sido: "if (n>0) { b }", sin "else", porque es más limpio y no hay riesgo de error incontrolado en apilar/desapilar, pero a cambio sería ligeramente menos óptimo por entrar dos veces más en el algoritmo cada vez que se llega por n=1 (aunque en ambas es "entrar, no hacer nada, salir", lo cuál sería imperceptible).
Mover_Varios_Discos (NumDiscos, TO, TD, TA)
{
if (NumDiscos > 0)
{
Mover_Varios_Discos(NumDiscos - 1, TO, TA, TD)
Mover_Un_Disco(TO, TD)
Mover_Varios_Discos(NumDiscos - 1, TA, TD, TO)
}
}
A pesar de mis observaciones (con intención constructiva) aclarar que me ha gustado mucho el vídeo (Like +1), incluso te animo a añadirle dos partes más:
1) Mostrar porque, a diferencia de con el algoritmo de factorial (donde el recursivo y el iterativo son prácticamente idénticos), el algoritmo recursivo de las torres de Hanoi queda tan elegante. Explicar que esto es dado a que en iterativo el algoritmo tiene que controlar - o encontrar - cuáles son los discos superiores de cada torre, lo que hace que la "lectura humana" del algoritmo sea más difícil ya que uno tiene que saber el patrón de movimientos de la solución. En cambio, con el recursivo la única visión que uno necesita es la global de los 3 movimientos
* mover todos los discos menos uno de Origen a Auxiliar
* mover el disco restante de Origen a Destino
* mover los discos de Auxiliar a Destino.
2) Mostrar porque en el algoritmo recursivo no funciona la visión global de (aunque a priori parezca más óptimo ya que no habría tanta recursividad)
* mover disco pequeño de Origen a Auxiliar
* mover en recursivo el bloque de discos restantes de Origen a Destino
* mover disco pequeño de Auxiliar a Destino
porque n-1?
Brillante.
ni siquiera estoy viendo esto en la u pero ya lo entendi xD bueno almenos en teoria.
Te Felicito
Muy bueno el video jajaja
Eres un Crrrrack
Shiiuuffff que talento para hablar tan rápido y pronunciar bien.
aiuda estoy procrastinando :v
no entendi, el codigo siempre se va a meter en "hanoi" y no va a pasar a las siguientes lineas de codigo
hasta que llegue al caso base cosa que todas las metidas de hanoi que hubieron detras se resuelven
Fabuloso :)
👌
buena alexelcapo
que wen video!! :')
buen video pero el pseudocodigo no esta bien igual gracias ya con eso ya lo pude hacer yo like
por que "n-1"?
no viste el ejemplo de las torres de hanoi? primero movio los elementos de arriba -1, ese -1 es el elemente mas grande.
Muy interesante :D
Interesante. +1like+1sub
hey habla mas despacio, no todos cpatamos todo a la velicdad de la luz,...me gusta tu método pero no entendemos a esa velocidad....
Bajale la velocidad al video, cráneo!
Ibai, eres tu?
Pero no resolviste la torre de Hanoi con los 4 discos 😡
en 0.25x para entender que carajos es lo que está explicando....
3*3 = 9... 9 - 1 = 8 y no 7 XD
prefiero hacerlo manualmente
no entediii
Suena como a ibai xD
Curioso, muchas veces han dicho que mi voz es como la de alexelcapo, pero lo de ibai es más nuevo.
no me vengas con cuentos
No se te entiende Tío ! lástima...
No pasa nada, he intentado mejorar un poco la manera de narrar desde entonces para hablar más despacio. Igual debería regrabar vídeos como estos en algún momento.
ibai??
wtf parece ibai
la basura de pagina que pusiste para el juego no anda
Bro el vídeo tiene varios años, lo reviso por si hubiese muerto la web
english
No logro comprender tu comentario.
no explicas, sólo repites
Mis cojones en vinagre, pero ok.