汉诺塔(java版)

汉诺塔原理

汉诺塔规则:有A、B、C三根柱子,设汉诺塔层数为N,则最底最大的一个盘数便是N。例如下图有三层则N=3,我们只需将A柱上(1-N)个盘全部移至B柱或C柱上即可(挪动盘时,N值大的必须放在N值小的下面)。
在这里插入图片描述

分析

这道题最简便的方式就是递归,你要问我为啥用递归,因为我没考虑过用循环来解决这题,而且碰巧最近刚学了时间复杂度现学现卖,所以用递归也是没啥毛病的。
很多人应该都懂这道题的原理和解题思路但是就是无法用代码来实现。emmm,最关键的还是没有get到这题的点,我们一开始便说汉诺塔的层数,所以层数就是误导朋友们最大的障碍。
但是回过头来想,无论是3层5层10层,都是万变不离其宗的,无论多少层它第一次移动的都必须是最顶上N=1的那个盘,第二次移动的都得是N=2的那个盘,第三次移动的还得是N=1的那个盘。
所以说这就是规律,我们只需要简单的分析一下N=3和N=4时的情况,后面的东西就会豁然开朗了。

实例分析:

当N=3时:
1 A–>B
2 A–>C
1 B–>C
3 A–>B
1 C–>A
2 C–>B
1 A–>B
这就是汉诺塔N=3时运行的全过程

代码

public static void hannuota(int N, char from, char to, char help) {// 3,A,B,C
		if (N == 1) {
			System.out.println(N + "   " + from + "-->" + help);
			return;
		}
		hannuota(N - 1, from, help, to);
		System.out.println(N + "   " + from + "-->" + help);
		hannuota(N - 1, to, from, help);
		// System.out.println(N + " " + from + "-->" + help);
	}

```mermaid

代码详解

因为我们需要从上到下进行移动,在这种情况下,递归就会发挥出最大的作用。
(N用于存放层数,from,to,help分别表示三根柱子)//3,A,B,C
当运行到N==1时我们就开始进行盘的移动。
假设3个盘都在A柱上,先将1盘挪到C柱上,此时A柱上还有2、3盘
挪动后将 返回上级函数再将2盘的位置及挪的方位输出。
1、2挪动后就没有位置了,所以我们还需要进行二次递归对C柱上的1盘进行移动。
其实不用想的过于复杂,只需要将N=3时的情况搞定后面的多层也就迎刃而解
原因就是如果N=4时我们已经将1-N-1都挪到了C柱上表面空着的是B柱。实则A柱B柱都可以视为空,因为我们将A柱上的4盘挪到B柱后,A柱为空,但B柱上的是最大的一个盘所以我们可以在其上面放置任意的盘,因为不会再有盘会比B柱上的N盘更大了,一次类推,即使N=10,当我们将1-(N-1)挪到C后,也会是一样的算法。
这道题最误导人的地方便是每个柱之间的切换。在代码上也表现的很清楚,每次递归的时候输入的位置都会有所改变的。

第一个递归:
N=3 A B C
N=2 A C B
N=1 A B C
通过对柱位置的修改我们可以实现盘的移动。
第一个递归完成后我们的N个盘就实现了N盘的移动

第二个递归:
第二个递归就相当于第一个的往复只不过空闲柱从C柱转移到了A柱,所以我们只需要理解到第一个递归的原理,第二个就没什么难度了。

#编程小白,大神勿喷。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值