递归—汉诺塔

举报
bigsai 发表于 2021/02/03 00:44:46 2021/02/03
【摘要】 汉诺塔是经典递归问题:相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如下图)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A...

汉诺塔是经典递归问题:相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如下图)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。

1:如果A只有一个(A->C)
2:如果A有两个(A->B),(A->C),(B->C)
3:如果A有三个(A->C),(A->B),(C->B),(A->C),(B->A),(B->C),(A->C).
可以发现每增加一步,其中的步骤会多很多。但是不妨这样想。当有N个要从A->C时,且已知移动方式。使用函数表示move(a->c)。如果要是N 1个该如何想呢。是不是先不看最底下的那个盘子呢,把剩下的N从A移到B上。突然发现最底下还有一个盘子,刚好C为空,把这个最大的放在C上,剩下的就是N个从B移到C的问题了。
再看上面的3:把最上面的盘子从A移到B,在把A 的最大移到C。再把2个盘子从B借助A移到C。
再看上面的2:把最上面的盘子移到B,把最底下移到C,就转化成B移到C一个盘子的问题了。这种递归要从每一步的关系找。把N个问题差成N-1移动和最底下移动的问题。

在这里插入图片描述

  1. 如果A只有一个(A->C)
  2. 如果A有两个(A->B),(A->C),(B->C)
  3. 如果A有三个(A->C),(A->B),(C->B),(A->C),(B->A),(B->C),(A->C).
  4. 如果更多,那么将会爆炸式增长。
    在这里插入图片描述

可以发现每增加一步,其中的步骤会多很多。但是不妨这样想:

  • 当有1个要从A->C时,且已知移动方式。使用函数表示move(a->c)。同理其他move操作。
  • -------省略中间若干步骤不看,用递归思想看问题

分析n个从a—>cn-1个a—>c有什么联系?(hannuo(n)—>hannuo(n-1)有啥关系)
假设有n个盘子

  • hannuo(n-1)之后n-1个盘子从A—>C.
    在这里插入图片描述
  • 此时剩下底下最大的,只能移动到B,move(A,B)
    在这里插入图片描述
  • 那么你是否发现什么眉目了,只需原先的huannuo(n-1)相同操作从C—>B即可完成转移到B;那么我们的之前函数应该写成hannuo(n-1,A,C)但是又用到B,所以把B传进来hannuo(n-1,A,B,C)先表示为从n-1个从A(借助B执行若干操作)转到C
    在这里插入图片描述
  • 这一系列操作使得将n个盘子从A—>B但是我们要的是A—>C才是需要的hannuo(n,A,B,C);那么我们只需要更改下hannuo(n-1,----)顺序就好啦!

代码如下:

package 递归;
public class hannuota {
	static void move(char a,char b)
	{
		System.out.println("移动最上层的"+ a+ "到"+ b+ "\t");
	}
	static void hannuota(int n,char a,char b,char c)//主要分析每一大步对于下一步需要走的。
	{
		if(n==1) {move(a,c);}//从a移到c
		else
		{ hannuota(n-1,a,c,b);//将n-1个从a借助c移到b move(a,c); //将第n(最后一个)从a移到c。 hannuota(n-1,b,a,c);//再将n-1个从b借助a移到c
		}
	}
	public static void main(String[] args)
	{ hannuota(5,'a','b','c');
	}
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

这里写图片描述

文章来源: bigsai.blog.csdn.net,作者:Big sai,版权归原作者所有,如需转载,请联系作者。

原文链接:bigsai.blog.csdn.net/article/details/78865405

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。