首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Hanoi 问题(Java实现

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 */

527117

hanoi问题如下图所示_hanoi问题最经典算法

大家好,又见面了,我是你们朋友全栈君。 什么是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还有一个进阶题目就是判断当前状态时第几个最优状态,将在下篇文章进行讲述!

56740
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    手撕“汉诺算法”之详细图解

    汉诺问题回顾 汉诺(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)

    1.8K20

    经典递归问题--汉诺(java实现)

    经典递归问题–汉诺(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次)次,即

    15810

    图解汉诺问题( Java 递归实现

    汉诺简介 最近在看数据结构和算法,遇到了一个非常有意思问题——汉诺问题。 先看下百度百科是怎么定义汉诺规则: 汉诺(又称河内)问题是源于印度一个古老传说益智玩具。...额,好吧,好像有点啰里啰嗦。其实一句话就是,在三个柱子之间移动盘子,一次只能移动一个,并且要保证每一步上边盘子都要比下边盘子小,最终实现把所有的盘子都从最左边柱子移动到最右边柱子上。...下面我通过图解方式,演示整个移动过程,帮助你理解用递归解决这个问题思想。 汉诺图解 我们一步一步从简单到复杂。为了方便,我把三个柱子从左到右分别叫 A,B,C。盘子数字从上到下依次增大。...其实,通过前面的三个例子,我们可以发现,盘子移动是有规律可循。 细心你有没有发现,在每一步盘子移动过程中,总会有一步,是下边最大盘子,从 A 移到 C 。...因此,我们可以把这个动作抽象出来,把除了最下边盘子之外其他盘子看成一个整体。这样的话,整个流程,就和两个盘子移动过程没什么两样了。总共就三步,我以四个盘子为例。看以下动画, ?

    83210

    Hanoi(汉诺

    说明: 汉诺(河内)(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

    96020

    算法训练 Hanoi问题

    问题描述   如果将课本上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,再将最大盘移到目标柱子

    84720

    【汉诺】经典递归问题(Java实现)图文并茂讲解

    什么是汉诺 汉诺(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'

    50210

    第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-933 汉诺四

    第十四届蓝桥杯集训——练习解题阶段(无序阶段)-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

    21130

    对汉诺递归算法简单理解

    一.历史背景:汉诺(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表示中转

    9910

    汉诺递归算法流程图_汉诺算法递归表达式

    汉诺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 开始移动柱子

    72320

    汉诺——各种编程范式解决

    理解递归,汉诺(Tower of Hanoi)是个很适合工具,不大不小,作为最开始递归理解正合适。...从而学习各种计算机语言乃至各种编程范式时候,汉诺一般都作为前几个递归实现例子之一,是入门好材料。   本文从汉诺规则出发,讲讲汉诺递归解法以及各种编程范式下汉诺实现。...汉诺介绍   汉诺传说是源于印度古老传说。   汉诺游戏一共有三根柱子,第一根柱子上有若干个盘,另外两根柱子上没有盘。 ?   ...C++实现   C++作为当今世界上最复杂计算机语言,没有之一,是值得说说。...有点诡异啊,长和平常习惯语言很不一样了。   比如这里如果我想查4个盘汉诺,从柱1移到柱3, ?- hanoi(4,1,3,2,S),write(S),!.

    1.9K30

    python求解汉诺游戏

    本文实例为大家分享了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 -

    82620

    利用Java枚举实现简单状态

    利用Java枚举实现状态想法比较新颖,在某些场景下用处也很大,看了一篇文章不错翻译在此。...概述 本文讲述利用Java枚举实现简单状态机。我们也会对比使用这种方法和接口和具体类方式优势。 2. Java枚举 Java是一个定义了一系列常亮特殊类。枚举类型更安全,可读性也更高。...状态模式也是知名GoF32种设计模式之一。状态机是从数学中借鉴而来概念。 4. 用枚举实现状态机 通过枚举实现状态核心是,我们不需要明确设置状态,而是通过逻辑让状态流转到下一个状态。...枚举实现状态优势 通过类或者接口方式实现状态机代码量非常大而且不容易维护。 而Java枚举则是一种简化形式,是一个常量列表,可以用来定义状态。...而且枚举也可以定义行为,我们可以定义方法来实现状态转换。 6.  结论 本文主要讲述如何使用Java枚举来实现状态机并给出了代码和测试案例。

    1.5K20

    【c语言】汉诺问题详解(c语言递归函数)

    问题介绍及背景 汉诺,又称河内。是一个源于印度古老传说益智玩具。...接下来我们就分析一下汉诺问题具体思路! 图解汉诺移动 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; }

    30910

    Python ---- 算法入门(3)分治算法解决【汉诺】问题

    汉诺问题起源 汉诺问题源自印度一个古老传说,印度教“创造之神”梵天创造世界时做了 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, 甲, 乙,

    42210

    【C语言】函数递归例子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上 所以需要调用实参就是三个柱子

    7010
    领券