%c\n",a,c);else {hanoi (n">

汉诺塔程序解读

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

hanoi塔程序如下:

main()

{hanoi(3,'A','B','C');

}

hanoi(n,a,b,c)

int n;

char a,b,c;

{if (n==1) printf("%c-->%c\n",a,c);

else {hanoi (n-1,a,c,b);

printf ("%c-->%c\n",a,c);

hanoi (n-1,b,a,c);}

}

运行结果:

A-->C

A-->B

C-->B

A-->C

B-->A

B-->C

A-->C

问题:

hanoi(n,a,b,c)

int n;

char a,b,c;

{if (n==1) printf("%c-->%c\n",a,c);

else {hanoi (n-1,a,c,b);

printf ("%c-->%c\n",a,c);

hanoi (n-1,b,a,c);}

}

我给你详细解释下这个程序中的代码吧。我也是刚学,希望对你有用。可能有些不好之处,还希望谅解。

先说下这个问题的整体思想:

1,如果只有1个盘,那么就直接把这个盘从A移动到C上。

2,如果存在两个盘,那么先把第一个盘移动到B上,在把最下面一个盘移动到C上,在把B上的盘移动到C上。

3,这样,我们可以得出一个结论,如果存在N个盘,可以先把上面N-1个盘通过C 移动到B上,然后把第N个盘移动到C上,再把B上的N个盘通过A 移动到C上。

if (n==1) printf("%c-->%c\n",a,c);

这一句,表示只有1个盘子的时候,那么就是把第一个盘子直接移到第三个盘子上。

else {hanoi (n-1,a,c,b);

如果超过一个盘字,则需要先把N-1个盘子通过C 移动到B上。

printf ("%c-->%c\n",a,c);

把剩下的第N个盘,从A移动到C上。

hanoi (n-1,b,a,c);}

再把剩下的在B上的N-1个盘,通过A移动到C上。

这属于一个递归算法。

现在,N=3。

我们看下程序怎么运行的。

else {hanoi (n-1,a,c,b);

printf ("%c-->%c\n",a,c);

hanoi (n-1,b,a,c);}

N=3,也就是开始程序会执行

hanoi (2,a,c,b);这句语句。

再看,2还是大于1,所以

程序会继续运行。注意,这里,为hanoi (2,a,c,b); C和B 换了位置。

hanoi (2,a,c,b);

我们把数字代入,得出。

根据N=2,C和B 互换。以及下面的代码,得出

````````````````````````````````````````````````

hanoi(n,a,b,c)

int n;

char a,b,c;

{if (n==1) printf("%c-->%c\n",a,c);

else {hanoi (n-1,a,c,b);

printf ("%c-->%c\n",a,c);

hanoi (n-1,b,a,c);}

}

```````````````````````````````````````````````

hanoi(2,a,c,b)

int n=2;

char a,c,b;

{if (n==1) printf("%c-->%c\n",a,b);

else {hanoi (1,a,b,c);

printf ("%c-->%c\n",a,b);

hanoi (1,c,a,b);}

} / 这并不是正确的代码,只是为了得出答案而写的一些数据。/ 这样,我们可以看出,程序会先执行

else {hanoi (1,a,b,c);

所以,开始会先输出A C(中间的符号省略,以下也一样)

然后,再输出

printf ("%c-->%c\n",a,b); A B

接着,执行

hanoi (1,c,a,b);} 这时候,就是C B了。

也就是说hanoi(2,a,c,b) 的输出为AC AB CB

你的问题就已经解决了。

接下来再返回第一层:

现在,N=3。

我们看下程序怎么运行的。

else {hanoi (n-1,a,c,b);

printf ("%c-->%c\n",a,c);

hanoi (n-1,b,a,c);}

这时候,我们再把数字代进去。

现在,N=3。

我们看下程序怎么运行的。

else {hanoi (2,a,c,b);

printf ("%c-->%c\n",a,c);

hanoi (2,b,a,c);}

根据上面的结论

/ 也就是说hanoi(2,a,c,b) 的输出为AC AB CB /

可以看出,先执行第一条语句:

else {hanoi (2,a,c,b);

则输出AC AB CB

再执行第二条语句:

printf ("%c-->%c\n",a,c);

输出AC

然后执行第三条

hanoi (2,b,a,c);}

根据这里,/ 也就是说hanoi(2,a,c,b) 的输出为AC AB CB /

字母进行替代后,A变B,C变A B变C。

所以输出的AC AB CB 则为

BA BC AC

所以,最终的结果为AC AB CB AC BA BC AC

中间可能有很多废话,可以不看。

这样算下去,不管多少层都能推算出来,可复杂度会高得难以想像。#include "stdio.h"

void main()

{

void hanoi(int n,char one,char two,char three);

int m;

printf("input the number of diskes:");

scanf("%d",&m);

printf("The step to move %d diskes:\n",m);

相关文档
最新文档