zoukankan      html  css  js  c++  java
  • 汉诺塔-递归算法

    递归是一种强大的编程技术,他把一个问题分解为一组相似的子问题,每一问题都用一个寻常解去解决。递归函数就是会直接或者间接调用自身的一种函数,一般来说,一个递归函数调用自身去解决它的子问题。

    "汉诺塔"经典递归问题

    "汉诺塔"是印度的一个古老传说,也是程序设计中的经典的递归问题,是一个著名的益智游戏:

      题目如下:

        塔上有三根柱子和一套直径各不相同的空心圆盘,开始时源柱子上的所有圆盘都按从大到小的顺序排列。目标是通过每一次移动一个圆盘到另一根柱子上,最终把一堆圆盘移动到目标柱子上,过程中不允许把较大的圆盘放置在较小的圆盘上;

        

    寻找规律(把所有的圆盘移动到C):

      1)n(圆盘个数) == 1

        第一次:1号盘  A -> C      sum(移动次数) = 1

      2)n == 2

        第一次:1号盘 A -> B

        第二次:2号盘 A -> C

        第三次:1号盘 B -> C  sum = 3

      3)n == 3

        第一次:1号盘 A -> C

        第二次:2号盘 A -> B

        第三次:1号盘 C -> B

        第四次:3号盘 A -> C

        第五次:1号盘 B -> A

        第六次:2号盘 B -> C

        第七次:1号盘 A -> C  sum = 7

      以此类推...

      故不难发现规律,移动次数为:sum = 2^n - 1 

    算法分析(递归):

      把一堆圆盘从一个柱子移动另一根柱子,必要时使用辅助的柱子。可以把它分为三个子问题:

        首先,移动一对圆盘中较小的圆盘到辅助柱子上,从而露出下面较大的圆盘,

        其次,移动下面的圆盘到目标柱子上

        最后,将刚才较小的圆盘从辅助柱子上在移动到目标柱子上

       把三个步骤转化为简单数学问题:

        (1)     把 n-1个盘子由A 移到 B;

        (2)     把 第 n个盘子由 A移到 C;

        (3)     把n-1个盘子由B 移到 C;

      我们创建一个JS函数,当它调用自身的时候,它去处理当前正在处理圆盘之上的圆盘。最后它回一个不存在圆盘去调用,在这种情况下,它不在执行任何操作。

    JavaScript源代码实现

    var hanoi = function(disc,src,aux,dst){
        
        if(disc>0){
    
            hanoi(disc-1,src,dst,aux);
    
            console.log(' 移动 '+ disc +  ' 号圆盘 ' + ' 从 ' + src +  ' 移动到 ' +  dst);
    
            hanoi(disc-1,aux,src,dst)
    
        }
    
    }
    
    hanoi(3,'A','B','C')

    整个算法的思路是:

    1. 将A柱子上的n-1个盘子暂时移到B柱子上
    2. A柱子只剩下最大的盘子,把它移到目标柱子C上
    3. 最后再将B柱子上的n-1个盘子移到目标柱子C上

     

     

  • 相关阅读:
    系统测试分类与常见的系统测试方法
    测试级别
    测试对象介绍
    软件测试基本介绍
    课外作业1:将一个double类型的小数,按照四舍五入保留两位小数
    将一个double类型的小数,按照四舍五入保留两位小数.
    将一个double类型的小数,按照四舍五入保留两位小数
    安装JDK1.8以及配置环境变量的步骤
    C# .Net实现URL绝对路径和相对路径之间互相转换
    64 位win 7或windows 8下的visual studio不能连接Oracle数据库调试网站的问题
  • 原文地址:https://www.cnblogs.com/gitnull/p/14145507.html
Copyright © 2011-2022 走看看