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...

ความคิดเห็น • 85

  • @pahoolk
    @pahoolk ปีที่แล้ว +13

    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 😅

  • @quimmonzo
    @quimmonzo 2 ปีที่แล้ว +2

    Después de buscar un rato por internet, este video me ha iluminado en pocos segundos. Gracias

  • @makigas
    @makigas  9 ปีที่แล้ว +18

    ►► 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

    • @VideogamesAsArt
      @VideogamesAsArt 3 ปีที่แล้ว +4

      me encanta que tu comentario sea recursivo. Le hago click y vuelvo a tener el mismo comentario con el mismo enlace.

  • @5THEALEX458
    @5THEALEX458 3 ปีที่แล้ว +4

    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!!!

  • @Poliformado
    @Poliformado 9 ปีที่แล้ว +8

    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.

  • @Alexander-lg2do
    @Alexander-lg2do 4 ปีที่แล้ว +4

    Lo has explicado súper sencillo y entendible! Amé el vídeo

  • @camilolopez1936
    @camilolopez1936 4 ปีที่แล้ว +1

    Excelente video, entendí a nivel teórico cómo se resuelve el ejercicio. Muchas gracias ^^

  • @yadyguitar
    @yadyguitar 9 ปีที่แล้ว

    Muchisimas gracias! No pensé que de verdad lo ibas a publicar tan rápido! Hahahah en serio gracias! Saludos!

    • @danielchisica6486
      @danielchisica6486 7 ปีที่แล้ว

      ¿Para que necesitabas asimilar este concepto?

    • @yadyguitar
      @yadyguitar 7 ปีที่แล้ว

      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

    • @danielchisica6486
      @danielchisica6486 7 ปีที่แล้ว

      Te puedo pedir algunos consejos en base a tu experiencia, es que este semestre comienzo la asignatura de Programación Avanzada

    • @yadyguitar
      @yadyguitar 7 ปีที่แล้ว

      claro! yadyguitar@yahoo.es

  • @Alejopal
    @Alejopal 5 ปีที่แล้ว

    Muy buen video, me ha grada la forma como explicas y las notas graciosas que pones.

  • @diegom0209
    @diegom0209 8 ปีที่แล้ว +19

    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"?

  • @angiecruz5896
    @angiecruz5896 4 ปีที่แล้ว +2

    muy bien,me sirvio mucho a resolver mi tarea

  • @nasserelbacha3458
    @nasserelbacha3458 3 ปีที่แล้ว +3

    No sabía que ibai daba clases de programación

  • @perezsaul
    @perezsaul 8 หลายเดือนก่อน

    GRACIASS, toma tu merecido like y me suscribo

  • @davidhernandeze
    @davidhernandeze 9 ปีที่แล้ว +77

    Respira un poco, algunos no procesamos tan rápido

  • @carolinarodriguezgalicia4797
    @carolinarodriguezgalicia4797 5 ปีที่แล้ว +5

    Muy buena explicación crack❤

  • @spike_wav
    @spike_wav 4 ปีที่แล้ว +1

    buen doble tempo , ya debes ir a batallar en la redbull sobrado le ganas a khan

  • @ignaciodelgado99
    @ignaciodelgado99 8 ปีที่แล้ว +2

    Muy interesante y explicativo. Like

  • @marcozini8915
    @marcozini8915 4 ปีที่แล้ว

    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.

  • @albertvolcom730
    @albertvolcom730 5 ปีที่แล้ว

    Espera espera espera. También enseñas matemáticas?
    Esto se ha puesto más interesante de lo que creía

  • @HeyChobe
    @HeyChobe 5 ปีที่แล้ว

    Gracias es justo la explicación del algoritmo que necesitaba

  • @cesarmaat
    @cesarmaat 4 ปีที่แล้ว +13

    Aprendi mas historia :'vv

  • @acostamartin1997
    @acostamartin1997 5 ปีที่แล้ว +4

    Alguien puede explicarme en qué caso práctico uno programaría usando recursividad??

    • @rockarlandy
      @rockarlandy 5 ปีที่แล้ว +4

      en un metodo iterativo es más optimo que el uso de ciclos que tienen los lenguajes de programacion por defecto

    • @AndreuPinel
      @AndreuPinel 2 ปีที่แล้ว +2

      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)
      }

    • @acostamartin1997
      @acostamartin1997 2 ปีที่แล้ว

      @@AndreuPinel genial! Muchas gracias por la explicación muy completa

  • @Pivex10
    @Pivex10 8 ปีที่แล้ว +1

    Genial vídeo. Gracias.

  • @gvetri18
    @gvetri18 9 ปีที่แล้ว +9

    Los memes son lo mejor jajaja.

  • @DevD_82
    @DevD_82 ปีที่แล้ว

    Quién diría que ibai explicara temas de programación, un abrazo maquina!

  • @julioc.rojasa.3757
    @julioc.rojasa.3757 8 ปีที่แล้ว

    Muy bueno el video me ayudó de mucho

  • @EdukalCancunMexico
    @EdukalCancunMexico 7 ปีที่แล้ว +1

    Interesante solucion

  • @Martin-cu9hw
    @Martin-cu9hw 4 ปีที่แล้ว

    Bastante Interesante !! =)

  • @troncarl
    @troncarl 8 ปีที่แล้ว

    Me habeis salvado el culo tio,este video es la mera hostia

  • @j0kers814
    @j0kers814 4 ปีที่แล้ว

    Graciaas !

  • @ax3l03
    @ax3l03 8 ปีที่แล้ว

    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. :)

    • @makigas
      @makigas  8 ปีที่แล้ว +2

      +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.

    • @AndreuPinel
      @AndreuPinel 2 ปีที่แล้ว

      @@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

  • @lunita6906
    @lunita6906 5 ปีที่แล้ว

    porque n-1?

  • @julioverne3825
    @julioverne3825 9 ปีที่แล้ว

    Brillante.

  • @ngry-k7381
    @ngry-k7381 4 ปีที่แล้ว

    ni siquiera estoy viendo esto en la u pero ya lo entendi xD bueno almenos en teoria.

  • @luisdavidcastrocoronado4107
    @luisdavidcastrocoronado4107 9 ปีที่แล้ว

    Te Felicito

  • @zeidadelosreyesrodriguezme9729
    @zeidadelosreyesrodriguezme9729 8 ปีที่แล้ว

    Muy bueno el video jajaja

  • @primc6962
    @primc6962 6 ปีที่แล้ว

    Eres un Crrrrack

  • @pjaramayoful
    @pjaramayoful 7 ปีที่แล้ว

    Shiiuuffff que talento para hablar tan rápido y pronunciar bien.

  • @laniakea1501
    @laniakea1501 3 ปีที่แล้ว +1

    aiuda estoy procrastinando :v

  • @xxjjstillxx8709
    @xxjjstillxx8709 4 ปีที่แล้ว

    no entendi, el codigo siempre se va a meter en "hanoi" y no va a pasar a las siguientes lineas de codigo

    • @diegonanamejia1510
      @diegonanamejia1510 3 ปีที่แล้ว +1

      hasta que llegue al caso base cosa que todas las metidas de hanoi que hubieron detras se resuelven

  • @Chemaclass
    @Chemaclass 9 ปีที่แล้ว

    Fabuloso :)

  • @laspulguitasfantasticas4117
    @laspulguitasfantasticas4117 3 ปีที่แล้ว +1

    👌

  • @DrJonesJazzMore
    @DrJonesJazzMore 4 ปีที่แล้ว

    buena alexelcapo

  • @maxiivallejos622
    @maxiivallejos622 7 ปีที่แล้ว

    que wen video!! :')

  • @carlosprocrastianndo
    @carlosprocrastianndo 4 ปีที่แล้ว

    buen video pero el pseudocodigo no esta bien igual gracias ya con eso ya lo pude hacer yo like

  • @horseskull91
    @horseskull91 5 ปีที่แล้ว

    por que "n-1"?

    • @kevin-ff7wz
      @kevin-ff7wz 4 ปีที่แล้ว +1

      no viste el ejemplo de las torres de hanoi? primero movio los elementos de arriba -1, ese -1 es el elemente mas grande.

  • @TioTIZODioxdelaTiza
    @TioTIZODioxdelaTiza 9 ปีที่แล้ว +2

    Muy interesante :D

  • @mattiasezekielsashago3223
    @mattiasezekielsashago3223 2 ปีที่แล้ว

    Interesante. +1like+1sub

  • @anslara89
    @anslara89 7 ปีที่แล้ว +10

    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....

    • @ClintEsteMadera
      @ClintEsteMadera 6 หลายเดือนก่อน

      Bajale la velocidad al video, cráneo!

  • @facusalmini6513
    @facusalmini6513 3 ปีที่แล้ว +1

    Ibai, eres tu?

  • @brunoeduardovigoparedes4808
    @brunoeduardovigoparedes4808 ปีที่แล้ว

    Pero no resolviste la torre de Hanoi con los 4 discos 😡

  • @hoswardvilloria7705
    @hoswardvilloria7705 4 ปีที่แล้ว

    en 0.25x para entender que carajos es lo que está explicando....

  • @danielgavirialopez4268
    @danielgavirialopez4268 2 หลายเดือนก่อน

    3*3 = 9... 9 - 1 = 8 y no 7 XD

  • @williammoran3921
    @williammoran3921 5 ปีที่แล้ว

    prefiero hacerlo manualmente

  • @juanfelipelinares7721
    @juanfelipelinares7721 4 ปีที่แล้ว

    no entediii

  • @calatiaszone7422
    @calatiaszone7422 2 ปีที่แล้ว

    Suena como a ibai xD

    • @makigas
      @makigas  2 ปีที่แล้ว

      Curioso, muchas veces han dicho que mi voz es como la de alexelcapo, pero lo de ibai es más nuevo.

  • @jeanb7158
    @jeanb7158 3 ปีที่แล้ว

    no me vengas con cuentos

  • @jose_barreto
    @jose_barreto 5 ปีที่แล้ว +1

    No se te entiende Tío ! lástima...

    • @makigas
      @makigas  5 ปีที่แล้ว

      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.

  • @Guss_.1188
    @Guss_.1188 หลายเดือนก่อน

    ibai??

  • @soyio5383
    @soyio5383 2 ปีที่แล้ว

    wtf parece ibai

  • @juankovac5557
    @juankovac5557 ปีที่แล้ว

    la basura de pagina que pusiste para el juego no anda

    • @makigas
      @makigas  ปีที่แล้ว

      Bro el vídeo tiene varios años, lo reviso por si hubiese muerto la web

  • @marcus99hd69
    @marcus99hd69 9 ปีที่แล้ว

    english

    • @makigas
      @makigas  9 ปีที่แล้ว +11

      No logro comprender tu comentario.

  • @susper2331
    @susper2331 4 ปีที่แล้ว

    no explicas, sólo repites

    • @makigas
      @makigas  4 ปีที่แล้ว

      Mis cojones en vinagre, pero ok.