汉诺塔问题分析

来源:互联网 发布:兵器科学与技术 知乎 编辑:程序博客网 时间:2024/06/05 17:34

小白博主今天搞懂了汉诺塔问题。

下面给大家分析一下:

本身对于递归的理解不是很到位,经常把它当作黑盒子使用。

之前没有理解是因为一直在纠结它的栈的操作,运行,掉进了栈坑,一直在扣

着递归调用不放,没理解也弄的自己很乱。

看了书还有知乎大神的提示之后茅塞顿开。

解析:

假设有n个盘子,A,B,C三个塔,目的是最终把A中的盘子移动到C上,B是中转站。

但是过程中不允许大盘子落在小盘子上。

简化过程的思想就是把目的分成三步。

第一步:把n-1个盘子通过C移动到B上。

第二步:把第n个盘子移动到C上。

第三步:把n-1个盘子通过A移动到C上。

所以递归写法如下:

void Hannuota(int n,char a,char b,char c){if(n == 1){Move(a,1,c);}else{Hannuota(n-1,a,c,b);Move(a,n,c);Hannuota(n-1,b,a,c);}}
else语句中的三步即为描述的三步,if中的条件是终止入栈的条件,最后再一个个出栈调用move函数输出步骤。

详细代码如下:

#include<stdio.h>void Move(char a,int x,char b){printf("%d :%c →%c\n",x,a,b);}void Hannuota(int n,char a,char b,char c){if(n == 1){Move(a,1,c);}else{Hannuota(n-1,a,c,b);Move(a,n,c);Hannuota(n-1,b,a,c);}}int main(){int n;scanf("%d",&n);Hannuota(n,'A','B','C');return 0;}



原创粉丝点击