图解汉诺塔(满屏幕都是图)

图解汉诺塔(满屏幕都是图)

和很多人一样,我刚刚接触汉诺塔的时候,可能说是头晕目眩,立马放弃。
但如果用图形表示感觉会好很多。
以下是我的学习思路:

汉诺塔问题

首先。递归的思路是什么?
把复杂的问题简单化
这里有四层塔,我们要在大塔不压小塔的情况下,把塔从x移动到z。(灵魂手绘看得懂就行)

所以,我们需要写个函数来实现这一功能。 首先,我们知道这个函数一共包括四个参数:汉诺塔的层数、x、y、z(图中包括的四个信息)。我们暂时把这个函数写作:

f ( n , x , y , z ) f(n,x,y,z) f(n,x,y,z)
其中
n n n—汉诺塔层数
x x x—x轴
y y y—y轴
z z z—z轴

这个函数的功能是把n层汉诺塔从x移动到z,且中间要通过y。(当然这里的x、y、z都是形参,你传入什么就是什么,不代表图中的轴)
本着把复杂问题简单化的原则,每一个步骤都用一条语句实现。

步骤1:

这里我们把n-1从x移动到了y上,当然我们不能同时移动这么多层,所以形成这一局面一定要通过z。(是不是很熟悉,你想到了什么?……函数,是不是,可以返回去看看) 这里写出函数:
好的你完成了第一步。

步骤2

现在你可以愉快的把x轴上的一层塔移动到z轴上了!

步骤3:

把y轴上的n-1层塔移动到z轴上,通过x轴。

大功告成!


什么?没看懂!不着急,下面开始技术总结:

技术总结

当然有一种例外情况(也是递归出口),当n=1时,可以直接从x轴移动到z轴。

现在我们可以开始设计函数了:

好的现在开始写程序(我用的是c,函数名称叫:hanota)

#include <stdio.h>
void hanota(int n, char x, char y, char z)
{
	if (n == 1)
	{
		printf("%c --> %c\n", x, z);
	}
	else
	{
		hanota(n - 1, x, z, y);
		hanota(1, x, y, z);
		hanota(n - 1, y, x, z);
	}
}

int main(void)
{
	char x ='x';
	char y ='y';
	char z ='z';
	int n = 4;
	hanota(n, x, y, z);

}
/*
结果输出:
x --> y
x --> z
y --> z
x --> y
z --> x
z --> y
x --> y
x --> z
y --> z
y --> x
z --> x
y --> z
x --> y
x --> z
y --> z

*/
  • 14
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值