#include<stdio.h>//汉诺塔问题运用到递归思想,
int num=0 ;//首先要给大家介绍一下堆栈
//想象一下,有一个递归函数当他执行自己本身的程序时
//因为条件满足,它程序又进去它本身的这个函数,
//而这个程序本身执行到当前位置就会暂时停止 (因为递归)
//这时候,需要有一个空间去存放停止时候的具体数据
//堆栈是一个用于存放上个位置暂停(因为递归)时的数据
//当递归完成以后,才会删除掉堆栈保存的数据
//堆载在这个程序中作用是用于 存储和利用 递归函数暂停时的数据,计算机自动存储和使用了
//详细想了解可以看我下方链接视频,谢谢
int move(char c1,char c2)//自定义的move函数
{//显示盘子移动轨迹和num计数 统计移动次数
printf("%c->%c\n",c1,c2);num++;
}
//n个盘子,从x移动到z,中途经过y,临时存放
int hanoi(int n,char x,char y,char z)
{
if(n==1)//跳出递归的出口条件是当n为1
//意思是当这块碟子只剩下1块时,就可以自由的移动到指定位置
move(x,z);
else{//这里是汉诺塔的核心思想算法(建议背诵记忆)
//在执行许多个递归本身后就能够清楚的显示移动路径
hanoi(n-1,x,z,y);//第一步:把n-1只碟子从x杆经z杆移动到y杆
move(x,z);//move函数第二步:将x杆上第n只碟子移动到z杆
hanoi(n-1,y,x,z);//第三步:然后将n-1只碟子从y杆经x移动到z杆
}//汉诺塔解决的算法是哪些数学家想出来的,我们不是数学家
//也没必要去想数学家如何创造该算法出来的
//我们只是普通的凡人,为了更好的生活而奋斗,仅此而已
//我觉得我们作为程序员暂时只是需要灵活运用该算法解决实际问题即可
}//我在文章下方分享了我在b站上看的这个视频,我借鉴了原作者的图片和代码
//如果读者想要深入了解学习这个步骤是如何运行的,可以点击下方连接进入学习
int main()
{
int n;
printf("Please input n:");
scanf("%d",&n);//输入碟子个数
hanoi(n,'a','b','c');//传递参数,进入汉诺塔函数
printf("%d",num);//输出统计的移动次数
return 0;
}
以下图片为个人笔记,是一个三级汉诺塔的运动过程,和原理分析
视频链接: