zoukankan      html  css  js  c++  java
  • 汉诺塔啊啊啊O(≧口≦)O

    传统汉诺塔问题:

    汉诺塔由n个大小不同的圆盘和三根木珠a、b、c组成。开始时,这n个圆盘由大到小依次套在a柱上,要求把a柱上n个圆盘按如下规则移到c柱上:

    (1)一次只能移一个圆盘;

    (2)圆盘只能在三根柱上存放;

    (3)在移动过程中,不允许大盘压小盘;

    问将这n个盘子从a柱移到c柱上,总共需要移动的次数?

    这个问题可以用递推来解决啦~(≧▽≦)/~啦啦啦,想象一下,将n-1个盘子看成一个整体,设移动一个盘子的最少步数为f(1),移动两个盘子的最少步数则为f(2),移动三个盘子的最少步数则为f(3),以此类推,移动n个盘子的最少步数则为f(n)。

    那么如何用计算机实现f(n)的计算呢?

    可以先想一下,如果是要移动三个盘子时的解决方法,如果要移动三个盘子到c柱,需要将a柱最下面的盘子放到c柱最下面,那么如何实现这个操作呢?需要将a柱最下面盘子的上面两个盘子先取下,将其放在b柱上,(那我标记一下吧,称最上面的盘子为一号盘,一号盘下面的为二号盘,二号盘下面的为三号盘,以此列推.....)

    如何实现一号盘和二号盘的取下呢,当然要先取下一号盘啦!(首先明确一点,把两个盘子放在b柱和放在c柱上的步数是没有差别的!)

    f(2)=f(1)+1+f(1)而f(1)又是已知的,所以f(2)也可以推出来,后面的就以此列推,f(n)=f(n-1)+1+f(n-1)=2*f(n-1)+1;←这是递推式

    那通项公式呢?↓

    f(n)+1=2*f(n-1)+2

    f(n)+1=2*[f(n-1)+1]

    设f(n)+1=g(n)

    则f(n-1)+1=g(n-1)

    所以g(n)=2*g(n-1)

    g(1)=2

    所以g(n)=2n

    f(n)+1=2n

    f(n)=2n-1

    呀呀呀啦啦啦~(≧▽≦)/~啦啦啦哈哈哈O(∩_∩)O哈哈哈~嘿嘿嘿

    再附上几个blog链接好啦,讲的是加强版汉诺塔Y(^o^)Y

    用栈求解汉诺塔问题,利用递归求解增强版汉诺塔问题

    四柱加强版汉诺塔问题

    “为什么圆规能画出圆?” “因为心不变,脚在动。”
  • 相关阅读:
    微软职位内部推荐-Senior SDE
    在使用Fake framework的时候,为什么有一些函数没有生产mock呢?
    Call Azure Queue get "The remote server returned an error: (400) Bad Request."
    技术分享
    IT牛人博客
    Spring-data-redis操作redis cluster
    Spring对Hibernate事务管理【转】
    Hibernate事务管理
    Redis与Memcached对比
    LockSupport的park和unpark
  • 原文地址:https://www.cnblogs.com/xrj1229/p/9216275.html
Copyright © 2011-2022 走看看