博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
递归算法之汉诺塔
阅读量:4646 次
发布时间:2019-06-09

本文共 1196 字,大约阅读时间需要 3 分钟。

递归定义:

递归算法是把问题转化为规模缩小了的同类问题的子问题。然后 递归调用函数(或过程)来表示问题的解。

一个过程(或函数)直接或间接调用自己本身,这种过程(或函数)叫递归过程(或函数).

递归算法解决问题的特点:

(1) 递归就是在过程或函数里调用自身。

(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。

(3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。

(4) 在 递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成 栈溢出等。所以一般不提倡用递归算法设计程序。

例子:汉诺塔

解:(1)n == 1

             第1次  1号盘  A---->C       sum = 1 次

       (2)  n == 2

             第1次  1号盘  A---->B

             第2次  2号盘  A---->C

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

  (3)n == 3

        第1次  1号盘  A---->C

        第2次  2号盘  A---->B

        第3次  1号盘  C---->B

        第4次  3号盘  A---->C

        第5次  1号盘  B---->A

        第6次  2号盘  B---->C

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

 

不难发现规律:1个圆盘的次数 2的1次方减1

       2个圆盘的次数 2的2次方减1

                        3个圆盘的次数 2的3次方减1

                        。  。   。    。   。 

                        n个圆盘的次数 2的n次方减1

 故:移动次数为:2^n - 1

代码实现:

 

// topN盘子个数,from-->初始塔座 inter-->辅助塔座 to-->最终塔座    public static void doTower(int topN, char from, char inter, char to) {        if (topN == 1) {            System.out.println("盘子1,从" + from + "塔座 到" + to + "塔座");        } else {            doTower(topN - 1, from, to, inter);            System.out.println("盘子" + topN + ",从" + from + "塔座 到" + to + "塔座");            doTower(topN - 1, inter, from, to);        }    }

 

转载于:https://www.cnblogs.com/whu-2017/p/8971882.html

你可能感兴趣的文章
查找单向链表中倒数第K个节点
查看>>
vue <input type="file">上传图片、预览、删除
查看>>
移动端H5地图离线瓦片方案(1)(2)
查看>>
缓存的三种方案
查看>>
CentOS 7 下安装 Nginx
查看>>
Java-Day04,基本语法
查看>>
C# 实现函数回调
查看>>
一些源码的地址
查看>>
2013-11
查看>>
一、Windows下Git的安装与配置
查看>>
设计灵感
查看>>
Java中float型最大值大于long型?
查看>>
搭建Hadoop集群(centos6.7+hadoop-2.7.3)
查看>>
Xprog 5.5.1 fix xprog-m 5.0 software error and authorization error
查看>>
java基础(第四章课后作业)
查看>>
基础 - 选项卡的实现
查看>>
Asp.net GridView隔行变色和光棒效果2种方法实现
查看>>
第一迭代任务
查看>>
《淘宝技术这十年》读后感
查看>>
sqoop安装与简单实用
查看>>