现在的位置: 首页 > 综合 > 正文

对递归的一些理解

2013年12月05日 ⁄ 综合 ⁄ 共 743字 ⁄ 字号 评论关闭

1.首先要明白一般在一个函数调用其他函数的过程中堆栈的操作情况:

      当在一个函数的运行期间调用另一个函数时,在运行被调用函数之前,系统需先完成3件事:(1)将所有的实在参数、返回地址等信息传递给被调用函数保存;(2)为被调用函数的局部变量分配存储区;(3)将控制转移到被调函数的入口。而从被调用函数返回调用函数之前,系统也应完成3件工作:(1)保存被调函数的计算结果;(2)释放被调函数的数据区;(3)依照被调函数保存的返回地址将控制转移到调用函数。当有多个函数构成嵌套调用时,按照“后调用先返回”的原则,上述函数之间的信息传递和控制转移必须通过“栈”来实现,即系统将整个程序运行时所需的数据空间安排在一个栈中,每当调用一个函数时,就为它在栈顶分配一个存储区,每当从一个函数退出时,就释放它的存储区,则当前正运行的函数的数据区必在栈顶。  

 

2. 递归调用就是函数自己调用自己,关键是要记住调用时候运行的是同一个函数体(切记:每个递归调用的自身都有自己的函数体)每次递归调用的返回点都是上一次调用他的函数中,在调用运行完之后所应当运行的下一条代码;拿以下代码为例:

void func(int n){
 static int count = 1;
 if(n == 0){
  cout<<"No."<<count++<<endl;
  return;
 }
 else{
  func(n-1);
  if(n>=2)
   func(n-2);
  if(n>=4)
   func(n-4);
 } 

 

 

实际运行的过程正如书得前序遍历,此代码输出了可以到达终点的路径的个数(即叶子节点的路径),如下图:

     

相当于树的前序遍历。

 

最后:写递归程序的时候递归的终结条件一定要找好,否则根本就是白写,解决不了问题。

抱歉!评论已关闭.