日期:2014-05-17  浏览次数:20997 次

关于C的递归调用?这里的递归是怎么运行的?
#include<stdio.h>
main()
{
  hanoi(3,'A','B','C');
}

hanoi(n,a,b,c)
int n;
char a,b,c;
{int i=1;
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);
  }
}
这里到底是怎么调用的。每一步是怎么执行的,小弟很是不懂!
C 递归

------解决方案--------------------
如果你有一些数学归纳法的知识,也就是说大学基础数学支持,就可以立刻理解这样的解释:

你可以想象一下,假设在三根柱子上移动n个盘子,从a到b柱子(这里n、a、b、c都是数学变量),那么就等于是:首先将n-1个盘子先移动到c,然后把最大的那个盘子从a移动到b,最后再把n-1个盘子从c移动到b。由于n这个变量的值是收敛的,因此知道此算法总归会在n=1时收敛结束。

只需要给出这个推导公式,就可以归纳推理出“它是可行的计算”。其中打印每一步的n、a、b、c四个变量的值,就是跟踪的状态堆栈。

凡是数学归纳法进行推导,总是自顶向下发现结果的,而不是从底层向上拼凑结果的。
------解决方案--------------------

------解决方案--------------------
关于“调用”,你应该学习数据结构中关于“堆栈”的概念,然后了解c语言函数使用堆栈来“进入”(Push各个参数)和“离开”(Pop各个参数以及返回值)函数体代码的方法,这大概跟理解hanoi塔模型所需要的想象力是一样的。
------解决方案--------------------
也可以参考这个文章理解下:http://suizouwuya.blog.163.com/blog/static/100708329201192693329112/