本篇博客只是一些个人感想和疑问,不适合作为汉诺塔问题的求解教程。
自学C语言两个多月,第一次摸爬滚打写出了汉诺塔问题的代码,关于汉诺塔问题的背景这里不再过多描述,以下是个人一些思考历程(第一次发布博客,如有不当之处请各位指出):
第一次接触汉诺塔问题是在自学时的递归部分,看完那部分的视屏教程老师提出了这个思考题。一开始进行了几遍汉诺塔游戏过后,我的疑惑是,该如何去构造使得该问题可以像游戏画面一步一步的在屏幕上打印出来,创建三个数组作为三根柱子?但是对我来说未免也太过复杂了,考虑到数组内容的拷贝,以及每次移动一块,而且大块必须在下方,我始终想不到好的解决方案。并且递归这部分每次都让人想的头晕,要写写画画好几张草稿纸,这里我在B站看到一条弹幕说“试图人脑压栈”,这可能就是头晕的根本原因——探究递归函数的内部细节。之后在“借鉴”了社区大佬的思考后,原来只要实现步骤的打印,再根据步骤一步一步的走就可以实现汉诺塔的移动。
然后B站up主“五点七边”提到“微操作”和“超级操作”让我觉得递归还能这样思考!不去过多探究递归的内部细节,而是相信只要我们设置好递归结束条件和当前层的结果处理,递归调用就一定可以正确的实现它的功能。以下是代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void move(int n, char scr, char dest)
{
//将具体移动步骤打印出来
printf("由%c->%c\n",scr, dest);
}
int Hannuota(int n, char x, char