注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

C++小知识24—递归  

2011-10-12 17:42:35|  分类: 算法及数据结构 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

C++小知识24—递归
在这个项目里因为使用tinyxml,所以用到了递归,那个同事写的XML的解析也是一蹋糊涂,这里分析递归也是一蹋糊涂。没办法了,弄好后,把一些细节总结一下,以咨后用。
1、递归的堆栈是自动保存的,也就是说如果你在函数里使用了临时变量,会在递归回退时自动退栈,不用担心丢失,当然,前提是不会栈溢出,可恶的溢出。
2、递归必须要有一个结束的条件,比如这里的当子结点为0时。
3、递归的嵌套返回,这里叫嵌套返回,不知道有没有更好的名字,就是这个样子:
DWORD CReadSyncXml::ReadTopology(string parent,CString filename,DWORD childAddr)

 for(int i=0;i<cnum;i++)
  {      
   ........

   //是否为目前结点地址
   if (childAddr == iAddr)
   {
    return iParentID;
   }
  }

  for (int i = 0;i < cnum;i++)
  {
   //迭代
   iParentID = ReadTopology(tmpbuf[i],filename,childAddr);
   if (iParentID != 0)
   {
    return iParentID;
   }
  }

  return iParentID;
}
如果单纯的递归,没有遍历和判断,就简单了,这里有遍历,也就是说象树的递归一样,要不断的分叉,这样,就要判断iParentID的值如果符合条件,也就是第一个return,而这时候儿如果你嵌套到一定深度时,返回后第二个for循环还会前进,如果没有第二个for循环中的if判断,那么会造成你的实际返回的值和想返回的值大不一样,当然,特殊情况下是一样的,不做讨论。
判断一下分支,在第一个循环里没有合适的条件时,啥也不返回,那么iParentID 为默认值,当然是退出栈来的默认值,第二循环亦如此,所以有必要在最后增加一个return, 其实也就是保证所有的分支都有语句返回,只是奇怪的是,编译器并不能判断不写最后一个时是否是正确的,也就是说他不保证所有的分支都会有返回值.

4、今天还有一个问题,就是和1有关,递归是自动压栈(不考虑溢出情况下),可是程序总是丢失数据,结果费了好大功夫,才发现,他的临时变量数据的获得是从一个类全局变量中得来的,而这个变量每次递归都用,会出现什么现象,什么现象?风中凌乱了好一阵子,写程序不带这样乱写的。

纸上学来终觉浅,绝知此事要躬行。努力!!!拜托。

  评论这张
 
阅读(918)| 评论(2)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017