Hanoi 塔问题(Java实现) Hanoi 塔问题是一个很经典的递归问题 设a,b,c是3个塔座。开始时,在塔座a上有一叠共n个圆盘,这些圆盘自下而上,由大到小地叠在一起。...各圆盘从小到大编号为1,2,…,n,现要求将塔座a上的圆盘移到塔座b上,并仍按同样顺序叠置。...在移动圆盘时应遵守以下移动规则: - 规则1:每次只能移动1个圆盘; - 规则2:任何时刻都不允许将较大的圆盘压在较小的圆盘之上; - 规则3:在满足移动规则1和2的前提下,可将圆盘移至a,...如果只有 1 个圆盘,a --> c 如果圆盘数大于1 将 n - 1 个圆盘,从 a 借助 c 移动到 b 将剩下 1 个圆盘从 a 移动到 c 将 n - 1 个圆盘,从 b 借助 a 移动到 c Java...源代码 import java.util.Scanner; /* * 若尘 */ /** * Hanoi 塔问题 * @author ruochen * @version 1.0 */
大家好,又见面了,我是你们的朋友全栈君。 什么是hanoi塔? 汉诺塔问题:古代有一个梵塔,塔内有三个座A、B、C,A座上有64个盘子,盘子大小不等,大的在下,小的在上。...如下图 问题解答 问题定义 我们把左边的柱子叫做A,中间的柱子叫做B,右边的柱子叫做C hanoi`塔的搬运过程; i :左边的柱子只有两个圆盘 我们先假设在A柱子上只有两个圆盘,不用图我们用大脑想象出来最佳流程就是...已经没有了 ╭︿︿︿╮ {/ o o /} ( (oo) ) ︶ ︶︶ 以上是对hanoi塔的总体概述,下面就要聊一聊真正的代码流程!...当圆盘更多的时候无非就是进行递归知道递归到上面的状态,比如有三个圆盘的时候,调用的是: hanoi(2,A,C,B); //step1 printf("%d move %c to %c \n",n,A,...还有一点题外话,当递归到程序注释的step1的时候,会为后续语句分配空间但不执行! hanoi塔还有一个进阶的题目就是判断当前的状态时第几个最优的状态,将在下篇文章进行讲述!
Java基础语法(汉罗塔) 1 起源 2 需求 3 分析 3.1 1个碟子 3.2 2个碟子 3.3 3个碟子 3.4 4个碟子 3.5 规律 4 代码实现:直接算法 5 代码实现封装:栈的思想 1...起源 汉罗塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。...4 代码实现:直接算法 代码常规实现:Hanrota.java /** * @author zc * @date 2021/10/29 9:30 * 汉罗塔 * 1.有三根杆子 A,B,C; * 2.A...就是在上一步的代码实现:直接算法上封装一下。...首先要 java 实现一个栈,再递归分治解决汉罗塔移动:MyStack.java package com; /** * @author zc * @date 2021/10/29 11:13 * 栈:MyStack
汉诺塔问题回顾 汉诺塔(Tower of Hanoi)源于印度传说中,大梵天创造世界时造了三根金钢石柱子,其中一根柱子自底向上叠着64片黄金圆盘。...我们仅能找出问题的解决方法并解决较小N值时的汉诺塔,但很难用计算机解决64层的汉诺塔。 在平常的编程练习过程中,汉诺塔问题也是一个十分常见的算法案例。...首先我们来看一个三层汉诺塔的图解,来对汉诺塔问题的解决有一个简单的了解: 如上图所示,我们可以看出,当盘子的数量只有一个的时候,我们可以直接将盘子移动到目标盘,在进行三层汉诺塔问题的解决时。...接下来分别使用java和Python向大家演示一下n阶汉诺塔的求解方法: Java求解汉诺塔 package 汉诺塔算法; public class Hanoi { public static...hanoi(n-1, a, c, b); move(a, c); hanoi(n-1, b, a, c); } //汉诺塔的移动次数为(2**n)-1 return (int)
经典递归问题–汉诺塔(java实现) 一、什么是递归 1.递归的定义 程序调用自身的编程技巧称为递归; 如求阶乘: public static int fac(int n) {...) { int ret = fac(5); System.out.println(ret); } 这里就是在fac()函数内部 不断调用 fac函数 ;通过简单的代码来实现复杂过程...“递过程” 蓝色箭头所指向的部分 均是归过程 而函数栈帧内 就说我们常说的 方法体,也可以叫做递推公式 二、汉诺塔问题 在了解完递归的原理之后,我们来解决一下汉诺塔的问题 1.汉诺塔(hanoi)的介绍...有三根相邻的柱子,标号为A,B,C, A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移动到柱子C上 每次只能移动一个圆盘,并且只能小圆片只能放在大圆盘上。...不了解汉诺塔的同学可以尝试一下在线汉诺塔小游戏:汉诺塔小游戏 (fuyeor.com) 总的来说: 如果只有一个圆盘,只需要移动一次 : 即 A->C 如果有三个圆盘,则需要移动(23 - 1次)次,即
汉诺塔简介 最近在看数据结构和算法,遇到了一个非常有意思的问题——汉诺塔问题。 先看下百度百科是怎么定义汉诺塔的规则的: 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。...额,好吧,好像有点啰里啰嗦的。其实一句话就是,在三个柱子之间移动盘子,一次只能移动一个,并且要保证每一步上边的盘子都要比下边的盘子小,最终实现把所有的盘子都从最左边柱子移动到最右边的柱子上。...下面我通过图解的方式,演示整个移动过程,帮助你理解用递归解决这个问题的思想。 汉诺塔图解 我们一步一步从简单到复杂。为了方便,我把三个柱子从左到右分别叫 A,B,C。盘子的数字从上到下依次增大。...其实,通过前面的三个例子,我们可以发现,盘子的移动是有规律可循的。 细心的你有没有发现,在每一步盘子移动的过程中,总会有一步,是下边最大的盘子,从 A 移到 C 的。...因此,我们可以把这个动作抽象出来,把除了最下边的盘子之外的其他盘子看成一个整体。这样的话,整个流程,就和两个盘子的移动过程没什么两样了。总共就三步,我以四个盘子为例。看以下动画, ?
说明: 汉诺塔(河内塔)(Towers of Hanoi)是法国人M.Claus(Lucas)于1883年从泰国带至法国的,河内为越战时北越的首都,即现在的胡志明市;1883年法国数学家 Edouard...Lucas曾提及这个故事,据说创世纪时Benares有一座波罗教塔,是由三支钻石棒(Pag)所支撑,开始时神在第一根棒上放置64个由上至下依由小 至大排列的金盘(Disc),并命令僧侣将所有的金盘从第一根石棒移至第三根石棒...,且搬运过程中遵守大盘子在小盘子之下的原则,若每日仅搬一个盘子,则当 盘子全数搬运完毕之时,此塔将毁损,而也就是世界末日来临之时。...如果盘数超过2个,将第三个以下的盘子遮起来,就很简单了,每次处理两个盘子,也就是:A->B、A ->C、B->C这三个步骤,而被遮住的部份,其实就是进入程式的递归处理。 ?...'C'); return 0; } Java: public class Hanoi{ int N; public static void hanoi(int n,char src
问题描述 如果将课本上的Hanoi塔问题稍做修改:仍然是给定N只盘子,3根柱子,但是允许每次最多移动相邻的M只盘子(当然移动盘子的数目也可以小于M),最少需要多少次? ...例如N=5,M=2时,可以分别将最小的2个盘子、中间的2个盘子以及最大的一个盘子分别看作一个整体,这样可以转变为N=3,M=1的情况,共需要移动7次。...Hanoi问题 2、输出转换后的步数。 ...1、此Hanoi塔与传统Hanoi塔的关系为:把n个盘中的每m个想成一个整体,就变成了传统的只能一次移动一个盘的Hanoi问题,n / m (如果有余数则+1)的结果就成了传统Hanoi塔的盘子数; ...2、分析传统Hanoi塔,假设初始状态盘子都在柱子A上,B为目标柱子,C为临时柱子,移动两个盘,需要3步(小盘--->C,大盘--->B,小盘---->B),移动三个盘,需要把前两个盘移动到柱子C,再将最大盘移到目标柱子
什么是汉诺塔 汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。...通过递归地执行这三个步骤,我们最终可以实现将所有盘子从A柱移动到C柱的目标。 【注意事项】 递归的终止条件:当只有一个盘子时,可以直接将其从A柱移动到C柱,此时递归终止。...递归的分解:将问题分解为三个步骤,每次递归调用都是为了完成这三个步骤中的一个。 递归的回溯:在完成一个递归调用后,需要将问题状态恢复到递归调用前的状态,以便进行下一个递归调用。...递归的效率:汉诺塔问题的递归解法时间复杂度为O(2^n),其中n表示盘子的数量。因此,当盘子数量较大时,递归解法的时间复杂度会非常高。...动画演示: 代码: public class Test6 { public static void main(String[] args) { hanoi(3, 'A', 'B'
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-933 汉诺四塔 ---- 目录 第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-933 汉诺四塔 前言 关于数学的疑问 算法训练...汉诺四塔 C语言 C++语言 Java语言 Python语言 总结 第六届——第十三届省赛题解 第六届——第十二届国赛题解 ---- 前言 这段时间我会把蓝桥杯官网上的所有非VIP题目都发布一遍...游戏规则 同汉诺塔相似,不过塔有4个,要求将盘子从塔1运到塔4。 输入格式 一个数n表示盘子数。 输出格式 第一行输出step表示你的操作步数。 ...接下来step行每行2个用空格隔开的数a,b表示将塔a最上面的盘子移到塔b。 你的输出只要保证能帮XJJ通关游戏即可,对步数没有太大要求,当然你操作100000步XJJ也会等不及的啦。...; Minmoves(n); cout<<f[n]<<endl; Hanoi4(n,1,2,3,4); return 0; } Java语言 在扫描输入内容上会有不同的方法,但是与Scanner
一.历史背景:汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。...二.递归算法:这里n,表示总共有几个盘子 ,a表示当前的塔,b表示中转塔,c表示目标塔,(注意:他们递归时,中转塔会,当前的塔,目标塔会改变)这里用一个静态变量sum,来记住盘子移动的次数。...2.有很多盘子时(n个),移动盘子的递归思想可以大概直接抽象为: 把(n-1)个盘子看作一个整体,借助C塔 从A-->B(具体移动过程中靠函数递归来实现)再把最底部那个盘子,借助B塔从 A-->C。...最后把(n-1)个盘子,借助A塔从B-->C 三.具体代码如下: public class Hanoi { public static int sum = 0; public static...void hanoi(int n, String a, String b, String c) { /** n表示总共有几个盘子 * a表示当前的塔,b表示中转塔,
题目 汉诺塔 1、程序分析 Hanoi塔问题,算法分析如下,设A上有n个盘子(编号由上到下:1、2、3……、n)。...2、程序实现 #tpoic : 汉诺塔 #File Name : Hanoi.py #Author : Jack...move(1,n_from,n_to) #只有一个盘子直接将初始塔A上的盘子移动到目标塔C else: hanoi(n-1,n_from,n_to...C上 hanoi(n-1,n_transit,n_from,n_to)#最后将中转塔上的n-1个盘子移动到目标塔上 if __name__ == '__main__':...i = 1 n = int(input('请输入盘子的个数:')) print('盘子移动的方法如下:') hanoi(n,'A','B
汉诺塔来源及应用 相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如下图)。 ...汉诺塔游戏规则 有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。...(图3) hanoi(n-1,B,A,C); ? 算法总述: ? hanoi函数的实现: ?...move函数的实现//打印移动的轨迹: void move(char c1, char c2) //move函数打印出移动的轨迹 { printf("%c-->%c\n", c1, c2);...} 4. c语言代码实现 #include //汉诺塔问题 void move(char c1, char c2) //move函数打印出移动的轨迹 { printf("%c-->%c\
汉诺塔(Hanoi) 编程实现把 A 的 n 个盘子移动到 C(盘子编号是 [1, n] ) 每次只能移动1个盘子 大盘子只能放在小盘子下面 1、汉诺塔 — 1个盘子 2、汉诺塔 — 2个盘子...个盘子从 A 移动到B ② 将编号为 n 的盘子从 A 移动到C ③将 n– 1 个盘子从 B 移动到C ✓ 步骤①③ 明显是个递归调用 4、汉诺塔 — 实现 public...class Hanoi { public static void main(String[] args) { new Hanoi().hanoi(3,"A","B","C"); } /** *...将n个碟子从p1挪动到p3 * @param p2 中间的柱子 */ void hanoi(int n,String p1,String p2,String p3){ if (n == 1){...,将n-1个碟子从p2移动到p3 hanoi(n-1,p2,p1,p3); } /** * 将 no号盘子从 from 移动到 to * @param no 碟子 * @param from 开始移动的柱子
理解递归,汉诺塔(Tower of Hanoi)是个很适合的工具,不大不小,作为最开始递归的理解正合适。...从而学习各种计算机语言乃至各种编程范式的时候,汉诺塔一般都作为前几个递归实现的例子之一,是入门的好材料。 本文从汉诺塔规则出发,讲讲汉诺塔的递归解法以及各种编程范式下汉诺塔的解实现。...汉诺塔介绍 汉诺塔传说是源于印度的古老传说。 汉诺塔游戏一共有三根柱子,第一根柱子上有若干个盘,另外两根柱子上没有盘。 ? ...C++实现 C++作为当今世界上最复杂的计算机语言,没有之一,是值得说说的。...有点诡异啊,长的和平常习惯的语言很不一样了。 比如这里如果我想查4个盘的汉诺塔,从柱1移到柱3, ?- hanoi(4,1,3,2,S),write(S),!.
本文实例为大家分享了python求解汉诺塔游戏的具体代码,供大家参考,具体内容如下 一、问题定义 百度百科定义:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。...二、代码实现 # 将n个盘子借助y柱从x柱移动到z柱 def hanoi(n, x, y, z): count = 0 if n == 1: # 递归出口 print(x, ' -- ',...z) return 1 else: # 将前n - 1个盘子借助z柱从x柱移动到y柱上 count += hanoi(n - 1, x, z, y) # 递归调用 # 将最底下的1个盘子从...递归调用 return count def main(): hanoi_level = input("请输入汉诺塔层数:") print("总共移动次数为%d" % hanoi(int(...hanoi_level), 'X', 'Y', 'Z')) if __name__ == '__main__': main() 当黄金圆盘为4层时,代码的输出结果为: 请输入汉诺塔层数:4 X -
利用Java枚举实现状态机的想法比较新颖,在某些场景下用处也很大,看了一篇文章不错翻译在此。...概述 本文讲述利用Java枚举实现简单的状态机。我们也会对比使用这种方法和接口和具体类方式的优势。 2. Java枚举 Java是一个定义了一系列常亮的特殊类。枚举类型更安全,可读性也更高。...状态模式也是知名的GoF的32种设计模式之一。状态机是从数学中借鉴而来的概念。 4. 用枚举实现状态机 通过枚举实现状态机的核心是,我们不需要明确设置状态,而是通过逻辑让状态流转到下一个状态。...枚举实现状态机的优势 通过类或者接口方式实现状态机代码量非常大而且不容易维护。 而Java枚举则是一种简化的形式,是一个常量列表,可以用来定义状态。...而且枚举也可以定义行为,我们可以定义方法来实现状态的转换。 6. 结论 本文主要讲述如何使用Java的枚举来实现状态机并给出了代码和测试案例。
问题介绍及背景 汉诺塔,又称河内塔。是一个源于印度古老传说的益智玩具。...接下来我们就分析一下汉诺塔问题的具体思路! 图解汉诺塔移动 n=3 这里可以理解为我们先将前n-1个圆盘借助C柱移到B柱,然后把最大的圆盘移到C柱,然后再以同样思路执行。...问题剖析及代码实现 前n-1个圆盘移动方法 前提:有n个圆盘以从小到大的顺序排在A柱上,有三个柱子,我们分别将这三个柱子记为A,B,C。...即把非空柱子上的圆盘移动到空柱子上,当两根柱子都非空时,移动较小的圆盘,移一次。这一步虽没有明确规定移动哪个圆盘,但执行的行动却是唯一的。 3.反复1和2操作,最后就完成了汉诺塔的移动。...n = 0; printf("汉诺塔的层数:>"); scanf(" %d", &n); Hanoi(n, 'A', 'B', 'C'); return 0; }
汉诺塔问题起源 汉诺塔问题源自印度一个古老的传说,印度教的“创造之神”梵天创造世界时做了 3 根金刚石柱,其中的一根柱子上按照从小到大的顺序摞着 64 个黄金圆盘。...实际上,解决汉诺塔问题是有规律可循的: 当起始柱上只有 1 个圆盘时,我们可以很轻易地将它移动到目标柱上; 当起始柱上有 2 个圆盘时: 移动过程是: 先将起始柱上的 1 个圆盘移动到辅助柱上...由此,n 个圆盘的汉诺塔问题就简化成了 n-1 个圆盘的汉诺塔问题。按照同样的思路, n-1 个圆盘的汉诺塔问题还可以继续简化,直至简化为移动 3 个甚至更少圆盘的汉诺塔问题。 4....代码实现 count 作为操作第几步得计步器; 通过规律总结,我们知道,当【起始柱】只有一个圆盘得时候,直接将圆盘移动到【目标柱】; 在【起始柱】不知有一个圆盘时,我们就将【N-1】一个圆盘从【起始柱】...【hanoi( 2, 甲, 丙, 乙)】,将第一个圆盘移动到辅助;也就是甲到丙;num=2; 执行hanoi(num - 1 = 1, sou, aux, tar)【hanoi(1, 甲, 乙,
昨天我总结函数递归说到了两个例子,今天我们就来看一下其中之一汉诺塔 1.汉诺塔是什么? 汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。...2020年8月3日,夏焱以33.039秒的成绩成功打破6层汉诺塔吉尼斯世界纪录。 2021年5月16日,中国龙岩的陈诺以29.328秒的成绩打破了6层汉诺塔吉尼斯世界纪录。...汉诺塔是一种经典的逻辑游戏,也是计算机科学领域中经典的算法问题。 这个游戏由三个竖立的柱子和一些不同大小的圆盘组成,开始时所有的圆盘都堆叠在柱子A上,而其他两个柱子则为空。...2.汉诺塔思路分析 根据汉诺塔的介绍,若把A柱子移动到C柱子,我们可以知道一结论 1.每次只能移动A柱最上面的一个盘子。 2.小盘子上不能放大盘子。...5.运用代码实现汉诺塔 创建Hanoi函数 首先在main函数里规定一个Hanoi函数,这个函数用来表示汉诺塔整个过程,根据汉诺塔的玩法其实整个过程就是将初始A上的盘子通过B移动到C上 所以需要调用的实参就是三个柱子
领取专属 10元无门槛券
手把手带您无忧上云