1、汉诺塔
个人建议在学递归之前先去看看方法的弹栈和压栈,了解完这个然后自己手动画画图,会对自己理解递归有很大的帮助,下面是我学二叉树的时候自己画的图;
#include<stdio.h>
/**
*
* 汉诺塔基本思路就是先把第一个柱子上面1到n-1个圆柱借助第三个柱子放到第二个柱子上面
* 然后在将第n个柱子放到第三个圆柱上面,
* 然后我们在把第二个柱子上面的圆柱放到第三个圆柱上面,就完成了汉诺塔的游戏(当然这是理想状态下);
* 因为第二个柱子上面的圆柱还需要借助第三个柱子将1到n-2个圆柱放到第一个圆柱,然后再把第n-2个圆柱放到第三个圆柱
* 因此,我们可以发现他们的步骤其实是一模一样的,而且任务的规模越来越小
* 因此,我们采用递归
*
* @return
*/
int main(){
void HanoiTask(int n ,char x,char y,char z);
printf("请输入圆柱的个数:");
int n ;
scanf("%d",&n);
HanoiTask(n,'A','B','C');
}
void HanoiTask(int n ,char x,char y,char z){
void move(char x,int num,char y);
if ( n == 1){
move(x,1,z); // 如果只有一个圆柱那么直接移动到第三个柱子
}else{
HanoiTask(n-1,x,z,y);
move(x,n,z);
HanoiTask(n-1,y,x,z);
}
}
void move(char x,int num,char y){
printf("%d %c->%c\n",num,x,y);
}