首先我们先了解一下什么是汉诺塔问题
让我们把这道题目的大概要求翻译成人话:
有下面这两个问题等待我们去解决-
1.有三个柱子,A,B,C我们要把A柱子上的所有圆盘都转移到C柱子上,且要将圆盘以从大到小的方式从下往上放。
2.要搞明白为什么会出现三根可以选择的柱子,尤其是这三个这个数字,让我联想到了中间变量中间存储变量值。
首先让我们来解决问题1,最大的圆盘要放在C杆最底部,我们就需要将最大盘以上的所有盘子取出去,方便我们将最大的盘拿出来,而且每次只能移动一个盘子。
递归的概念
递归分为两个过程,递推和回归
递推就是我们不断将问题进行和简化的过程,而回归就是我们在该次递推下达到的效果
简化就可以理解为不断自己调用自己的过程,而函数就是完成一个固定的动作做,我们就需要找出这个问题下不断重复的动作就可以。
让我们回到汉诺塔问题本身,要找出这个问题中不断重复的动作,我们先将这个问题抽象出来:
其实这三个柱子可以按功能分为,传接柱、起始柱,目标柱,想要实现将圆盘以从下到上排列就必须将每一个盘子的上面的其余盘子拿开,我们就可以移动这个盘子了。
ok,我们就拿移动最后一个圆盘举例,我们就得将最后一个圆盘上的盘子都存放到B盘上,而下一个圆盘就得将该圆盘上的盘子放在A盘上
我们就得到了一个动作;将起始柱上的其余圆盘拿到转接柱上,将最后一个圆盘放到目标柱上,而且我们发现,起始柱和转接柱是可以互相转化的。
递推的过程我们就明白了,下一个回归就是将这一次最后的圆盘移动到C柱上。思路搞定我们就可以开始敲代码了。
#define line 5//有line个圆盘
#include<stdio.h>
void Hanoi(char start, char exchange, char target,int n)
{
if(n==1)
{
printf("%c->%c", &start, &target);
}
else
{
Hanoi(n - 1, 'a', 'b', 'c');//此时a为目标柱
printf("%c->%c", start, exchange);
Hanoi(n - 1, 'b','a', 'c');//此时b为目标柱
}
}
int main()
{
int t = line;
Hanoi('a', 'b', 'c',t);
return 0;
}
汉诺塔问题解决,小萌新的一点点感想,希望能得到大佬们的指点。