user-0 提问: Hanoi塔 递归

回复:
user: user-1
content: 这种二路递归，一般是形成一棵递归树（二叉树）。 执行到每棵子树，都到达叶节点，即非递归分支（i == 1） 为止。 hanoi 相当于遍历高度为 n的满二叉树。

user: user-2
content: “给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出

user: user-3
content: hanni(n,A,B,c) ;的执行过程 hanni(n-1,A,C,B)  ;       //先把A上的n-1个盘子移到B上 printf（“%c -> %c ”,A,C）;   //再把A上最后一个盘子移到到C上 hanni（n-1，B,A,C）;  //再把B上的n-1个盘子移到到C上  至于第一步中如何A上的n-1个盘子移到B上 那就是hanni(n-1,A,C,B)  ; 的执行过程 hanni(n-2,A,B,C)  ;       //  把n-2个盘字从A移到C上 printf（"%c  -> %c",A,C）//再把A上的倒数第二个盘子从A移到B上 hanni(n-2,C,A,B)  ;     //把n-2个盘子从C移到B上 ........... 就这样递归下去。   直到hanni（1，.....) 压栈出栈。直至结束 以三为例，我画了个他的执行过程：  递归要我的理解与函数调用差不多 只不过是调用的这个函数是函数本身，调用被调用函数之前都要将自身的参数进行压栈，函数之间不断的调用，循环往复，遇到最终的结束条件之后，开始出栈，有一步步的出栈.... 说的够清楚了吧 每五个换行就是在它每打印一次时判断一下是否够五个了，够了打印换行，就是二楼的做法。 #include <stdio.h>  void hanoi(int i , char A , char B , char C); int count=0;  int main() {     int n;     while(scanf("%d",&n)!=EOF) 	{         if(n==0)             return 0;         hanoi(n , 'A' , 'B' , 'C');         printf("\n"); 	}     return 0 ; }  void hanoi(int i , char A , char B , char C) {     if(i == 1)     {         printf("%c-->%c   ",A, C);         count++;         if(count % 5 == 0)             printf("\n");     }     else     {         hanoi(i - 1 , A , C , B);   //函数递归调用         printf("%c-->%c   ",A, C);         count++;         if(count % 5 == 0)             printf("\n");         hanoi(i - 1 , B , A , C);     } }

user: user-4
content: lz要不看看这个，看能明白不 http://www.360doc.com/content/12/0727/11/219024_226737868.shtml

user: user-0
content: 根据楼楼上的，  我知道递归要根据参数条件，  可根据那三个语句看来，  不断地递归，n会等于1，  等n=1的时候，执行if语句，  那么 那三个语句的下面两个语句是干嘛的？     else   {     hanoi(i - 1 , A , C , B);   //函数递归调用      move(i , A , C);     hanoi(i - 1 , B , A , C);   }

user: user-0
content: 看了你的博客，上面对hanoi塔的分析很详尽，但是那些我也懂，我的问题在于递归啊！   当执行到hanoi这一句时， 程序是调用hanoi自身一次，然后执行Move语句， 还是调用Hanoi自身一次，然后又执行到这里，继续调用hanoi？ 还是两步同时进行？ 还是调用hanoi直到i=1,然后执行move？可是这时候i是1了，move一次后，move后的hanoi的第一个参数就变成0了，函数怎么继续执行下去呢？

user: user-4
content: 引用 楼主 u012514377 的回复:当执行到hanoi这一句时， 程序是调用hanoi自身一次，然后执行Move语句， 还是调用Hanoi自身一次，然后又执行到这里，继续调用hanoi？ 还是两步同时进行？ 还是调用hanoi直到i=1,然后执行move？可是这时候i是1了，move一次后，move后的hanoi的第一个参数就变成0了，函数怎么继续执行下去呢？  这是我的第一个疑惑， lz了解递归吗？正像一楼所说的，每次调用的参数都不同，符合条件就继续调用，不符合就靠 if 语句结束，否则又怎么结束递归呢？  能否继续下去，要看符不符合的条件

user: user-5
content: 可以参考下我的blog:  汉诺塔(the Tower of Hanoi )  http://blog.csdn.net/ithiker/article/details/5498118

user: user-6
content: 在main的每组输入后清count 在move函数中count++和输出回车  #include <stdio.h>  void hanoi(int i , char A , char B , char C); void move(int i , char x , char y);  int count=0;  int main() {   int n;   while(scanf("%d",&n)!=EOF)   {     count=0;//加     if(n==0)       return 0;     hanoi(n , 'A' , 'B' , 'C');     printf("\n");   }   return 0 ; }  void hanoi(int i , char A , char B , char C) {   //count++;   if(i == 1)   {     move(i , A , C);     //if(count%5==0)     //printf("\n");   }   else   {     hanoi(i - 1 , A , C , B);   //函数递归调用      move(i , A , C);     hanoi(i - 1 , B , A , C);   } }  void move(int i , char x , char y) {   //static int c = 1 ;   //局部变量i申明为 static    printf("%c-->%c   ",x , y);   if((++count)%5==0) printf("\n");//改 }

user: user-7
content: 执行到hanoi时会不会继续递归下去当然要看本次调用的参数咯。每一次调用到hanoi时参数的值并不都是一样的。