#include<stdio.h>
void hanoi(int n,char a,char b,char c){//把n个盘子从a柱移动到c柱
if(n>0){
hanoi(n-1,a,c,b);//n-1个盘子从a移动到b
printf("%c->%c\n",a,c);//1个盘子从a移动到c
hanoi(n-1,b,a,c);//n-1个盘子从b移动到c
}
}
int main(){
int n=0;
scanf("%d",&n);
hanoi(n,'A','B','C');
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/2ea628b1be32a35dfb08fbecb7d7736a.png)
Hanoi问题,a,b,c是三个塔座,每次移动一个圆盘,大圆盘不能压在小圆盘上。此问题运用了递归算法,执行时要多次调用自身,要为算法建立递归调用工作栈。
在一个算法中调用另一算法时,系统需要运行被调用算法之前先要完成三件事:将所有实参指针、返回地址等信息传递给被调用算法;为被调用算法的局部变量分配储蓄区;将控制转移到被调用算法的入口。
在从被调用算法返回调用算法时,系统也要相应的完成三件事:保存被调用算法的计算结果;释放分配给被调用算法的数据区;依照被调用算法保存的返回地址将控制转移到调用算法。