趁着复习把课上的作业和代码上传上来嘿嘿嘿,这个系列的代码都是自己写的或者老师教学用的可能内存管理上有点小瑕疵,但是算法理解还是不错的!本系列所有代码在dev-cpp上可以跑通~
汉诺塔:
一次只移动一片,不管在哪根针上,小片必须在大片上面,然后要把一个针上的移动到另一个,源代码如下:
#include<stdio.h>
int s=0;
void Hanoi(int n,char A,char B,char C){
if(n==1){
printf("step%d:move %d %c->%c\n",++s,1,A,C);
}
else{
Hanoi(n-1,A,C,B);
printf("step%d:move %d %c->%c\n",++s,n,A,C);
Hanoi(n-1,B,A,C);
}
}
int main(){
Hanoi(4,'A','B','C');
return 0;
}
下面我们一起来理解一下:
首先看1-2的移动方案(我们假设有A、B、C)三个柱子,一开始在A柱子,然后移动到C柱子
一个的时候,直接从A到C
两个的时候,先把第一个放到B,然后再把第二个放到C然后把B上的放到C
……

(知乎答主酱紫君做的动画)
一直列举下去会发现,其实就是先把n-1个放到B,然后再把第n个放到C,最后把n-1个从B放到C。
我们的hanoi(f1,f2,f3,f4)接收三个参数,表示把f1个东西从f2柱子移动到f4去,所以对应的代码为:
Hanoi(n-1,A,C,B);//n-1个从A移动到B
printf("step%d:move %d %c->%c\n",++s,n,A,C);//第n个移动到C
Hanoi(n-1,B,A,C);//把n-1个从B到C
这是我们的递归的划分,还要递归出口,我们知道出口是n==1的时候,这个时候直接把剩下的1个从A搬到C。
C语言实现汉诺塔递归算法
本文介绍如何使用C语言实现汉诺塔的递归算法。通过理解递归划分和递归出口,详细解释了如何将n个盘子从一个柱子移动到另一个柱子,重点在于n=1时的特殊情况处理。
2万+





