逐步精化的汉诺塔求解(一定能懂、c++实现)

  • 本文适用于看了几篇汉诺塔求解答文章,但是还是一知半解的思考者。
  • 如果不理解什么是汉诺塔的可以先自行百度。

相信大家对汉诺塔的规则并不陌生。这里不再赘述。
网上关于汉诺塔的代码大同小异,仅仅由于由于我本人偏好C++所以编写如下。

#include<iostream>
#include<algorithm>
#include<string>
static int step = 0;
using namespace std;
void move(int n, string a, string b)
{
	step++;
	cout <<"第"<<step<<"步:盘子" << n << "从" << a << "移动到" << b << endl;
}
void hanio(string x, string y, string z, int n)
{
	if (n == 0)
	{
		return;
	}
	hanio( x, z, y, n - 1);
	move(n, x, z);
	hanio(y, x, z, n - 1);
}
int main()
{
	int n;
	cout << "请输入原始一号柱子上的盘子数量" << endl;
	cin >> n;
	hanio("一号柱子", "二号柱子", "三号柱子", n);
	return 0;
}

相信这段代码在语法阅读上没有任何的难点。大部分人和我一样,真正的问题是非常不理解,这段代码是怎么来的。

难点在于:这段代码用了一个递归的思路。

在对时间复杂的要求不高,但是空间复杂度要求较大的时。
递归相对于动态规划确实是一个更好的解决方式。
这也是为什么大家都使用这种递归的求解方式来解决汉诺塔问题。

本人在初学递归这个思想的时候,已经陷入了一种迷茫。后来学习了“树”的数据结构之后
通过做题,才开始可以真正地理解递归的思想。

遇到汉诺塔问题的时候,从“前人”代码入手,想当然的想通过画“树”进行求解。事实证明,这样只会让我自己在汉诺塔的问题上更加无所适从。因为代码调用了两次递归。画图非常容易让自己彻底绕进去。显然,在反复的绕晕自己之后,我更加没有信心去理解这段代码本身了。

后来随着学习的加深,对计算机理论的理解。我才可以真正的理解这段代码。

在《计算机网络》这门课程中,我们经常讲“透明”这一概念。简单的说。“透明”就是你进行了一系列的封装,但是我可以直接享受到你封装的成果,而不用管你执行的过程。

透明:在计算机中,客观存在并且运行着但是我们看不到的特性。
客观存在的,但对于某些开发人员而言又不需要了解的东西,这就是计算机所指的透明性.简单来说,透明就是黑盒,你只需要应用它给出的接口,而不需要了解内在机理。

打个最简单的比方,比如我们可以通过3D眼镜看到3D电影,但是我们不需要知道3D眼睛的工作原理一样。此时3D眼镜对我们是透明的。
我认为在汉诺塔问题的求解上,我们也需要在全局上使用透明这一思想。

下面进行汉诺塔求解。这里我用三步来求解这个问题。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值