相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘。
游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。

一、汉诺塔问题c语言代码:

#include<stdio.h>
void f(int n,char a,char b,char c)
{
    if(n>0)//递归终止条件 
    {
      f(n-1,a,c,b);//a→b 
        printf("第%d个盘子:%c->%c\n",n,a,c);//n→c 
        f(n-1,b,a,c);//b→c 
    }
}
int main()
{
    int n;
    printf("please input numbers:\n");
    while(scanf("%d",&n)!=EOF)
    {
    f(n,65,66,67);//传值给函数 
	}
	return 0;
}

执行三次后的情况:

二、汉诺塔的通项公式
递推公式: H(k)=2H(k-1)+1。
通项公式(有n个圆盘,全部完成需要的次数):sum=2^n-1。

三、汉诺塔问题的时间复杂度
由其多项公式可知时间复杂度为O(2^n)。

四、可视化图解

有3个圆盘时:

有10个圆盘时

四、总结
汉诺塔永远只有三步!
1.将A上面的n-1个盘子移到B上,即An-1次
2.将第n个盘子移到C上,一次就好
3.将B上面的两个盘子,移到C上,即An-1次



试着单纯从外部去理解汉诺塔递归问题,进入递归内部容易晕。