汉诺塔,简单递归带你破解出攻略
汉诺塔
- 1-背景介绍
- 2-玩一玩图解
- 1片金片
- 2片金片
- 3片金片
- 4片金片
- 5片金片
- n片金片
- 3-通项公式证明
- 4-代码破解攻略
1-背景介绍
法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。
2-玩一玩图解
不管这个传说的可信度有多大,如果考虑一下把64片金片,由一根针上移到另一根针上,并且始终保持上小下大的顺序。这需要多少次移动呢?现在我们从左到右,分别把这3根柱子称为A,B,C,不管多少根金片,我们的目的是把所有的金片按照规则,从A移到C上。因为当多个金片时,从A不能直接到C,所以我们换种说法,金片从A经过B移到C。
1片金片
这个很好处理,步骤为:
- 第1步:A>C
总共需要了1步,我们记为f(1)=1
2片金片
其步骤为:
- 第1步:A>B
- 第2步:A>C
- 第3步:B>C
总共需要了3步,我们记为f(2)=3
3片金片
其步骤为:我们可以简化一下步骤,把上面的2块黑色看成一个整体,把第3个黄色看成一个整体,所以把步骤变为3步
- 第1步:把2黑色从A经过C放到B,A-C>B,有f(2)=3
- 第2步:把1黄色从A经过B放到C,A-B>C,有f(1)=1
- 第3步:把2黑色从B经过A放到C,B-A>C,有f(2)=3
总共需要了3+1+3=7步,我们记为f(3)=f(2)+f(1)+f(2)=2f(2)+f(1)=7
4片金片
其步骤为:我们可以简化一下步骤,把上面的3块黑色看成一个整体,把第4个黄色看成一个整体,所以把步骤变为3步
- 第1步:把3黑色从A经过C放到B,A-C>B,有f(3)=7
- 第2步:把1黄色从A经过B放到C,A-B>C,有f(1)=1
- 第3步:把3黑色从B经过A放到C,B-A>C,有f(2)=7
总共需要了7+1+7=15步,我们记为f(4)=2f(3)+f(1)=15
5片金片
其步骤为:我们可以简化一下步骤,把上面的4块黑色看成一个整体,把第5个黄色看成一个整体,所以把步骤变为3步
- 第1步:把4黑色从A经过C放到B,A-C>B,有f(4)=15
- 第2步:把1黄色从A经过B放到C,A-B>C,有f(1)=1
- 第3步:把4黑色从B经过A放到C,B-A>C,有f(4)=15
总共需要了15+1+15=31步,我们记为f(5)=2f(4)+f(1)=31
n片金片
其步骤为:我们可以简化一下步骤,把上面的n-1块黑色看成一个整体,把第n个黄色看成一个整体,所以把步骤变为3步
- 第1步:把n-1黑色从A经过C放到B,A-C>B,有f(n-1)
- 第2步:把1黄色从A经过B放到C,A-B>C,有f(1)=1
- 第3步:把n-1黑色从B经过A放到C,B-A>C,有f(n-1)
总共需要f(n)=2f(n-1)+1步
3-通项公式证明
由f(n)=2f(n-1)+1
得f(n)+1=2f(n-1)+2=2(f(n-1)+1),即
f(n)+1=2(f(n-1)+1),同理
f(n-1)+1=2(f(n-2)+1)
f(n-2)+1=2(f(n-3)+1)
…,…,…,…,…,…
f(3)+1=2(f(2)+1)
f(2)+1=2(f(1)+1)
将上面所有式子左右两边分别相乘,正好可以消掉因子,得
f(n)+1=2(n-1)*(f(1)+1)=2n-1*2=2(n)
f(n)=2(n)-1
我们回到那个传说,不管这个传说的可信度有多大,如果考虑一下把64片金片,由一根针上移到另一根针上,并且始终保持上小下大的顺序。这需要多少次移动呢?n=64时,有f(64)=18446744073709551615 ,也就是需要移动18446744073709551615 次。
假如每秒钟一次,共需多长时间呢?一个平年365天有31536000秒,闰年366天有31622400秒,平均每年31557600秒,计算一下:这表明移完这些金片需要5845.42亿年以上,而地球存在至今不过45亿年,太阳系的预期寿命据说也就是数百亿年。真的过了5845.42亿年,不说太阳系和银河系,至少地球上的一切生命,连同梵塔、庙宇等,都早已经灰飞烟灭。
4-代码破解攻略
从上面中我们可以了解到,要移动n个金片,我们可以简化一下步骤,把上面的n-1块黑色看成一个整体,把第n个黄色看成一个整体,所以把步骤变为3步
- 第1步:把n-1黑色从A经过C放到B,A-C>B,有f(n-1)步
- 第2步:把1黄色从A经过B放到C,A-B>C,有f(1)=1步
- 第3步:把n-1黑色从B经过A放到C,B-A>C,有f(n-1)步
所以我们的递归代码为:
/*** 把n个金盘从a经过b移到c** @param n n个金片* @param a a柱子* @param b b柱子* @param c c柱子*/
public static void hannuota(int n, String a, String b, String c) {// 柱子没有结束if(n<1){return;}// 第1步:把n-1从A经过C放到B,A-C>Bhannuota(n-1,a,c,b);// 第2步:把第n个从A经过B放到C,A-B>CSystem.out.println(a+" 移动> "+c);// 第3步:把n-1从B经过A放到C,B-A>Channuota(n-1,b,a,c);
}
我们试一下:
当n=2时,其步骤为:
当n=3时,其步骤为:
汉诺塔,简单递归带你破解出攻略相关推荐
- 数据结构与算法—递归算法(从阶乘、斐波那契到汉诺塔的递归图解)
目录 递归介绍 递归求阶乘 递归求斐波那契 递归解决汉诺塔 总结 递归介绍 递归:就是函数自己调用自己. 子问题须与原始问题为同样的事,或者更为简单: 递归通常可以简单的处理子问题,但是不一定是最好的 ...
- 汉诺塔的递归实现,看完就懂了
对于要实现汉诺塔递归程序的同学,我相信有一部分同学还没有真正的玩过汉诺塔这个游戏,我建议先在手机应用商店下载一个汉诺塔游戏去感受一下,当了解了游戏的玩法之后,也更方便你去理解递归代码的逻辑. 下面通过 ...
- 汉诺塔问题 [递归 + 抽象]
汉诺塔 前言 一.题意 二.抽象思维 1.源码 三.扩展 1.分析 2.源码 总结 参考文献 前言 汉诺塔问题,是学习递归的第一个算法题,也是非常经典的递归问题.由于它是双递归问题,所以初学时不易理解 ...
- 汉诺塔——经典递归问题(c语言实现)
汉诺塔--经典递归问题(c语言实现) 问题背景 汉诺塔问题是一个经典的问题.汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下 ...
- 【恋上数据结构】递归(函数调用过程、斐波那契数列、上楼梯、汉诺塔、递归转非递归、尾调用)
递归(Recursion) 什么是递归? 函数的调用过程(栈空间) 函数的递归调用过程 递归实例分析(1 + 2 + 3 + ... + 100 的和) 递归的基本思想.使用套路 斐波那契数列 fib ...
- 汉诺塔的递归逐步详解
文章目录 汉诺塔介绍 递归代码实现 以三个盘子为例逐步详解 汉诺塔介绍 如上图,有三根柱子A,B,C,在A柱子上有N个盘子(图上只画了三个),利用这三根柱子和N个盘子进行汉诺塔游戏,需要最终将A柱子上 ...
- python面向过程实践汉诺塔_递归汉诺塔-和递归汉诺塔相关的内容-阿里云开发者社区...
多柱汉诺塔最优算法设计探究 多柱汉诺塔最优算法设计探究 引言 汉诺塔算法一直是算法设计科目的最具代表性的研究问题,本文关注于如何设计多柱汉诺塔最优算法的探究.最简单的汉诺塔是三个柱子(A.B.C),因 ...
- 从汉诺塔讲递归的思考方式
想象你来到某个热带丛林,意外发现了十层之高的汉诺塔.正当你苦苦思索如何搬动它时,林中出来一个土著,毛遂自荐要帮你搬塔.他名叫二傻,戴着一个草帽,草帽上有一个2字,号称会把一到二号盘搬到任意柱. 你灵机 ...
- labview求n阶乘的和_递归算法(从阶乘、斐波那契到汉诺塔的递归图解)
递归介绍 递归:就是函数自己调用自己. 子问题须与原始问题为同样的事,或者更为简单: 递归通常可以简单的处理子问题,但是不一定是最好的. 对于递归要分清以下概念: 自己调用自己 递归通常不在意具体操作 ...
最新文章
- 牛逼哄洪的 Java 8 Stream,性能也牛逼么?
- 肝了3版才满意:分布式系统之CAP理论,我们对它的理解和误解
- openresty开发系列36--openresty执行流程之6日志模块处理阶段
- Android.自定义控件的实现 (转载)
- LeetCode MySQL 1179. 重新格式化部门表
- unity 2020 怎么写shader使其接受光照?_如何在Unity中造一个PBR Shader轮子
- BTREE与其它索引的优缺点对比
- win+apache实现ssl的证书认证
- Java面试那些事--可能会问的那些问题(中高级篇)
- C# 读书笔记之访问虚方法、重写方法和隐藏方法
- php 在线更新,Updates.php给自己的主题添加在线更新功能
- Julia : |>的用法及多参数下的使用
- elasticsearch-carrot2插件打包
- 基础级拆机-神舟战神GX8CP5s1上8700发现较为鸡肋-仿CP7s2
- 电容和电感(自总结)
- SQL SERVER-连接池工作原理
- 三菱电梯开门键一直亮_电梯反复开关门是什么原因?
- apache2.2配置https协议(key文件、crt文件、csr文件生成方法)
- 蓝牙耳机什么牌子好?安卓蓝牙耳机性价比推荐
- 有时候可用 UIWebView 代替 UITextView,解决行间距问题
热门文章
- NF-ResNet:去掉BN归一化,值得细读的网络信号分析 | ICLR 2021
- 解密阿里云大规模深度学习性能优化实践
- 华硕FL8000U拆换机械硬盘
- 韩天峰php教程,韩天峰(Rango)的博客
- 基督信仰与电脑软件 随笔
- Opensource Licenses
- 大神的傅里叶变换,一定要看看
- 科大讯飞输入法android离线语音,讯飞输入法Android5.0.1752 离线语音更轻快的表达...
- 开发测试环境 k8s node节点磁盘不足运维
- 关于麒麟座开发板串口打印乱码与其它工程用官方源码出问题的解决方案