读书人

关于汉诺塔递归调用有关问题

发布时间: 2012-09-11 10:49:03 作者: rapoo

关于汉诺塔递归调用问题
我知道汉诺塔的递归调用是把前n-1个盘子从A上通过C移到B上,然后把第n个盘子从A移到C上,最后通过A,把B上的盘子移到C上,但具体过程还是不是很清楚,为什么可以这样实现。还有盘子为奇数与偶数的时候,第一步移动的方式怎么会不同呢,不是都用递归到移动第一个盘子的时候,就通过C移到B上吗?怎么会有先移到B上的呢?望详解!

[解决办法]

C/C++ code
#include<stdlib.h>#include<stdio.h> #define YI   1#define ER   2#define SAN  3 void ydyp(int,int,int,int); int main(void){      int n;      printf("请输入圆盘的个数\n");      scanf("%d",&n);      if (n>0)         {           ydyp(n,YI,ER,SAN);         }      else           printf("输入不合理数值\n");      system("PAUSE");      return 0;}void ydyp(int n,int yi,int er,int san){       if(n>0)         {                 ydyp(n-1,yi,san,er);                 printf("从第%d跟柱子移动一个圆盘到第%d跟柱子\n",yi,san);                 ydyp(n-1,er,yi,san);          } return;}
[解决办法]
探讨
程序我知道,也知道要把n个盘子从A搬到C上,要搬n-1个,n-2个……1个。递归调用。但是过程不太理解。
关于奇数偶数个盘子的问题是这样的,就是你要搬的盘子总数n(输入的数据),当它为奇数和偶数时,搬的第一步不相同,如从A经过B搬到C:(只写出移动的第一步)
当n=1时:A-->C
当n=2时:A-->B
当n=3时:A-->C
当n=4时:A-->B
也就说,当你输入的n为奇数时A-……

读书人网 >C语言

热点推荐