汉诺塔这个问题很经典,不清楚题目的同学可以去百度一下,在这小子就不多说了,进入正题;
让我们打开表格,看看这座塔:
这塔看起来不咋地对不对?不过,我们的目标是把它原封不动的搬到c列上,可以借助b列。让我们从最简单的做起:假设只有两层,从下往上分别是1,2,这时候你会说这题目简直就是在侮辱你的智商!只需要三步:
First.将2从a列移到b列;
Second.将1从a列移到c列;
Finally.将2从b列移到c列;
很简单对不对?那现在,让我们做做完整版:64层!不要紧张,先试试将1之上的所有积木只当做一层,那么我们又回到了刚才那简单的两层问题。所以,我们有f(n)来表示n层问题的答案,把1之上的积木移到b列需要f(n-1)步,将1移到c列(需要1步),再将b列上的积木移到c列又需要f(n-1)步。所以,可以得到等式:
f(n)=2*f(n-1)+1
这就是我们的递归公式了。
再看看步骤是如何输出的:
先定义一个子函数,函数名怎样都可以,只要不与保留字重复,如:
void f(int n,char a,char c,char b); //这里的参数所代表的意义是一个n层的汉诺塔,从a柱移到c柱上,其中可以借助b柱;
1.然后,把1之上的积木从a列移到b列,期间是可以借助c列的:
f(n-1,a,b,c);
2.将1移到c列(这只有一步,不需借助其他列):
printf("%d from %c to %c\n",n,a,c);
3.再将b列上的积木移到c列,借助a列(因为现在的a列是空闲的):
f(n-1,b,c,a);
说了那么多,让我们看看代码长什么样吧:
#include<stdio.h> int t=0;//需要操作的总步数为t步 void f(int n,char a,char c,char b);//把n盘从a柱移到c柱,借助b柱 int main() { int n; scanf("%d",&n); f(n,‘A‘,‘C‘,‘B‘); return 0; } void f(int n,char a,char c,char b) { if(n==0) return; f(n-1,a,b,c); t++;//统计操作步数 printf("%d:%d from %c to %c\n",t,n,a,c); f(n-1,b,c,a); }
代码有不足的还请包涵,有兴趣的同学可以跟踪一下它的执行过程,可以帮助你更好的了解递归算法的实现方式。
时间: 2024-10-11 17:23:39